Initial draft of report and analysis results

This commit is contained in:
Claudio Maggioni 2022-10-17 09:59:31 +02:00
parent 38496e47a0
commit bfdc3c43c3
4 changed files with 912 additions and 0 deletions

380
.gitignore vendored Normal file
View file

@ -0,0 +1,380 @@
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.fmt
*.fot
*.cb
*.cb2
.*.lb
## Intermediate documents:
*.dvi
*.xdv
*-converted-to.*
# these rules might exclude image files for figures etc.
# *.ps
# *.eps
# *.pdf
## Generated if empty string is given at "Please type another file name for output:"
.pdf
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex
*.synctex(busy)
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Build tool directories for auxiliary files
# latexrun
latex.out/
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# achemso
acs-*.bib
# amsthm
*.thm
# beamer
*.nav
*.pre
*.snm
*.vrb
# changes
*.soc
# comment
*.cut
# cprotect
*.cpt
# elsarticle (documentclass of Elsevier journals)
*.spl
# endnotes
*.ent
# fixme
*.lox
# feynmf/feynmp
*.mf
*.mp
*.t[1-9]
*.t[1-9][0-9]
*.tfm
#(r)(e)ledmac/(r)(e)ledpar
*.end
*.?end
*.[1-9]
*.[1-9][0-9]
*.[1-9][0-9][0-9]
*.[1-9]R
*.[1-9][0-9]R
*.[1-9][0-9][0-9]R
*.eledsec[1-9]
*.eledsec[1-9]R
*.eledsec[1-9][0-9]
*.eledsec[1-9][0-9]R
*.eledsec[1-9][0-9][0-9]
*.eledsec[1-9][0-9][0-9]R
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
*.glsdefs
*.lzo
*.lzs
*.slg
*.slo
*.sls
# uncomment this for glossaries-extra (will ignore makeindex's style files!)
# *.ist
# gnuplot
*.gnuplot
*.table
# gnuplottex
*-gnuplottex-*
# gregoriotex
*.gaux
*.glog
*.gtex
# htlatex
*.4ct
*.4tc
*.idv
*.lg
*.trc
*.xref
# hyperref
*.brf
# knitr
*-concordance.tex
# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files
# *.tikz
*-tikzDictionary
# listings
*.lol
# luatexja-ruby
*.ltjruby
# makeidx
*.idx
*.ilg
*.ind
# minitoc
*.maf
*.mlf
*.mlt
*.mtc[0-9]*
*.slf[0-9]*
*.slt[0-9]*
*.stc[0-9]*
# minted
_minted*
*.pyg
# morewrites
*.mw
# newpax
*.newpax
# nomencl
*.nlg
*.nlo
*.nls
# pax
*.pax
# pdfpcnotes
*.pdfpc
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# scrwfile
*.wrt
# svg
svg-inkscape/
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# pdfcomment
*.upa
*.upb
# pythontex
*.pytxcode
pythontex-files-*/
# tcolorbox
*.listing
# thmtools
*.loe
# TikZ & PGF
*.dpth
*.md5
*.auxlock
# titletoc
*.ptc
# todonotes
*.tdo
# vhistory
*.hst
*.ver
# easy-todo
*.lod
# xcolor
*.xcp
# xmpincl
*.xmpi
# xindy
*.xdy
# xypic precompiled matrices and outlines
*.xyc
*.xyd
# endfloat
*.ttt
*.fff
# Latexian
TSWLatexianTemp*
## Editors:
# WinEdt
*.bak
*.sav
# Texpad
.texpadtmp
# LyX
*.lyx~
# Kile
*.backup
# gummi
.*.swp
# KBibTeX
*~[0-9]*
# TeXnicCenter
*.tps
# auto folder when using emacs and auctex
./auto/*
*.el
# expex forward references with \gathertags
*-tags.tex
# standalone packages
*.sta
# Makeindex log files
*.lpz
# xwatermark package
*.xwm
# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib
# option is specified. Footnotes are the stored in a file with suffix Notes.bib.
# Uncomment the next line to have this generated file ignored.
#*Notes.bib

462
analysis.xml Normal file
View file

@ -0,0 +1,462 @@
<?xml version="1.0" encoding="UTF-8"?>
<system>
<pattern name="Factory Method">
<instance>
<role name="Creator" element="com.fasterxml.jackson.core.TokenStreamFactory" />
<role name="FactoryMethod()" element="com.fasterxml.jackson.core.TokenStreamFactory::createNonBlockingByteArrayParser():com.fasterxml.jackson.core.JsonParser" />
<role name="FactoryMethod()" element="com.fasterxml.jackson.core.TokenStreamFactory::createNonBlockingByteBufferParser():com.fasterxml.jackson.core.JsonParser" />
</instance>
<instance>
<role name="Creator" element="com.fasterxml.jackson.core.TSFBuilder" />
<role name="FactoryMethod()" element="com.fasterxml.jackson.core.TSFBuilder::build():com.fasterxml.jackson.core.JsonFactory" />
</instance>
</pattern>
<pattern name="Prototype" />
<pattern name="Singleton">
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.sym.Name1" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.sym.Name1::EMPTY:com.fasterxml.jackson.core.sym.Name1" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.JsonpCharacterEscapes" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.JsonpCharacterEscapes::sInstance:com.fasterxml.jackson.core.JsonpCharacterEscapes" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.JsonLocation" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.JsonLocation::NA:com.fasterxml.jackson.core.JsonLocation" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter$NopIndenter" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter$NopIndenter::instance:com.fasterxml.jackson.core.util.DefaultPrettyPrinter$NopIndenter" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.util.DefaultIndenter" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.util.DefaultIndenter::SYSTEM_LINEFEED_INSTANCE:com.fasterxml.jackson.core.util.DefaultIndenter" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter$FixedSpaceIndenter" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter$FixedSpaceIndenter::instance:com.fasterxml.jackson.core.util.DefaultPrettyPrinter$FixedSpaceIndenter" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.util.InternCache" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.util.InternCache::instance:com.fasterxml.jackson.core.util.InternCache" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.Version" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.Version::UNKNOWN_VERSION:com.fasterxml.jackson.core.Version" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.io.JsonStringEncoder" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.io.JsonStringEncoder::instance:com.fasterxml.jackson.core.io.JsonStringEncoder" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.io.ContentReference" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.io.ContentReference::UNKNOWN_CONTENT:com.fasterxml.jackson.core.io.ContentReference" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.io.CharTypes$AltEscapes" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.io.CharTypes$AltEscapes::instance:com.fasterxml.jackson.core.io.CharTypes$AltEscapes" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.JsonPointer" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.JsonPointer::EMPTY:com.fasterxml.jackson.core.JsonPointer" />
</instance>
<instance>
<role name="Singleton" element="com.fasterxml.jackson.core.filter.TokenFilter" />
<role name="uniqueInstance" element="com.fasterxml.jackson.core.filter.TokenFilter::INCLUDE_ALL:com.fasterxml.jackson.core.filter.TokenFilter" />
</instance>
</pattern>
<pattern name="(Object)Adapter">
<instance>
<role name="Adapter" element="com.fasterxml.jackson.core.JsonFactory" />
<role name="Adaptee" element="com.fasterxml.jackson.core.sym.ByteQuadsCanonicalizer" />
<role name="adaptee" element="com.fasterxml.jackson.core.JsonFactory::_byteSymbolCanonicalizer:com.fasterxml.jackson.core.sym.ByteQuadsCanonicalizer" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::createNonBlockingByteArrayParser():com.fasterxml.jackson.core.JsonParser" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::createNonBlockingByteBufferParser():com.fasterxml.jackson.core.JsonParser" />
</instance>
<instance>
<role name="Adapter" element="com.fasterxml.jackson.core.JsonFactory" />
<role name="Adaptee" element="com.fasterxml.jackson.core.io.InputDecorator" />
<role name="adaptee" element="com.fasterxml.jackson.core.JsonFactory::_inputDecorator:com.fasterxml.jackson.core.io.InputDecorator" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::createParser(byte[]):com.fasterxml.jackson.core.JsonParser" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::createParser(byte[], int, int):com.fasterxml.jackson.core.JsonParser" />
</instance>
<instance>
<role name="Adaptee" element="com.fasterxml.jackson.core.json.JsonReadContext" />
<role name="Adapter" element="com.fasterxml.jackson.core.base.ParserBase" />
<role name="adaptee" element="com.fasterxml.jackson.core.base.ParserBase::_parsingContext:com.fasterxml.jackson.core.json.JsonReadContext" />
<role name="Request()" element="com.fasterxml.jackson.core.base.ParserBase::getCurrentName():java.lang.String" />
<role name="Request()" element="com.fasterxml.jackson.core.base.ParserBase::overrideCurrentName(java.lang.String):void" />
<role name="Request()" element="com.fasterxml.jackson.core.base.ParserBase::_handleEOF():void" />
</instance>
<instance>
<role name="Adaptee" element="com.fasterxml.jackson.core.json.JsonWriteContext" />
<role name="Adapter" element="com.fasterxml.jackson.core.base.GeneratorBase" />
<role name="adaptee" element="com.fasterxml.jackson.core.base.GeneratorBase::_writeContext:com.fasterxml.jackson.core.json.JsonWriteContext" />
<role name="Request()" element="com.fasterxml.jackson.core.base.GeneratorBase::enable(com.fasterxml.jackson.core.JsonGenerator$Feature):com.fasterxml.jackson.core.JsonGenerator" />
<role name="Request()" element="com.fasterxml.jackson.core.base.GeneratorBase::disable(com.fasterxml.jackson.core.JsonGenerator$Feature):com.fasterxml.jackson.core.JsonGenerator" />
</instance>
<instance>
<role name="Adaptee" element="com.fasterxml.jackson.core.util.Separators" />
<role name="Adapter" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter" />
<role name="adaptee" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::_separators:com.fasterxml.jackson.core.util.Separators" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeObjectFieldValueSeparator(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeObjectEntrySeparator(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeArrayValueSeparator(com.fasterxml.jackson.core.JsonGenerator):void" />
</instance>
<instance>
<role name="Adaptee" element="com.fasterxml.jackson.core.util.Separators" />
<role name="Adapter" element="com.fasterxml.jackson.core.util.MinimalPrettyPrinter" />
<role name="adaptee" element="com.fasterxml.jackson.core.util.MinimalPrettyPrinter::_separators:com.fasterxml.jackson.core.util.Separators" />
<role name="Request()" element="com.fasterxml.jackson.core.util.MinimalPrettyPrinter::writeObjectFieldValueSeparator(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.MinimalPrettyPrinter::writeObjectEntrySeparator(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.MinimalPrettyPrinter::writeArrayValueSeparator(com.fasterxml.jackson.core.JsonGenerator):void" />
</instance>
<instance>
<role name="Adaptee" element="com.fasterxml.jackson.core.io.JsonStringEncoder" />
<role name="Adapter" element="com.fasterxml.jackson.core.io.SerializedString" />
<role name="adaptee" element="com.fasterxml.jackson.core.io.SerializedString::JSON_ENCODER:com.fasterxml.jackson.core.io.JsonStringEncoder" />
<role name="Request()" element="com.fasterxml.jackson.core.io.SerializedString::asQuotedChars():char[]" />
<role name="Request()" element="com.fasterxml.jackson.core.io.SerializedString::asQuotedUTF8():byte[]" />
<role name="Request()" element="com.fasterxml.jackson.core.io.SerializedString::asUnquotedUTF8():byte[]" />
<role name="Request()" element="com.fasterxml.jackson.core.io.SerializedString::appendQuoted(char[], int):int" />
<role name="Request()" element="com.fasterxml.jackson.core.io.SerializedString::appendQuotedUTF8(byte[], int):int" />
<role name="Request()" element="com.fasterxml.jackson.core.io.SerializedString::appendUnquotedUTF8(byte[], int):int" />
<role name="Request()" element="com.fasterxml.jackson.core.io.SerializedString::writeQuotedUTF8(java.io.OutputStream):int" />
<role name="Request()" element="com.fasterxml.jackson.core.io.SerializedString::writeUnquotedUTF8(java.io.OutputStream):int" />
<role name="Request()" element="com.fasterxml.jackson.core.io.SerializedString::putQuotedUTF8(java.nio.ByteBuffer):int" />
<role name="Request()" element="com.fasterxml.jackson.core.io.SerializedString::putUnquotedUTF8(java.nio.ByteBuffer):int" />
</instance>
<instance>
<role name="Adaptee" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter$Indenter" />
<role name="Adapter" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter" />
<role name="adaptee" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::_objectIndenter:com.fasterxml.jackson.core.util.DefaultPrettyPrinter$Indenter" />
<role name="adaptee" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::_arrayIndenter:com.fasterxml.jackson.core.util.DefaultPrettyPrinter$Indenter" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeStartObject(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::beforeObjectEntries(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeObjectEntrySeparator(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeEndObject(com.fasterxml.jackson.core.JsonGenerator, int):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeStartArray(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::beforeArrayValues(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeArrayValueSeparator(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeEndArray(com.fasterxml.jackson.core.JsonGenerator, int):void" />
</instance>
</pattern>
<pattern name="Command" />
<pattern name="Composite" />
<pattern name="Decorator">
<instance>
<role name="Component" element="com.fasterxml.jackson.core.JsonGenerator" />
<role name="Decorator" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate" />
<role name="component" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::delegate:com.fasterxml.jackson.core.JsonGenerator" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::getCodec():com.fasterxml.jackson.core.ObjectCodec" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::setCodec(com.fasterxml.jackson.core.ObjectCodec):com.fasterxml.jackson.core.JsonGenerator" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::version():com.fasterxml.jackson.core.Version" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::enable(com.fasterxml.jackson.core.JsonGenerator$Feature):com.fasterxml.jackson.core.JsonGenerator" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::disable(com.fasterxml.jackson.core.JsonGenerator$Feature):com.fasterxml.jackson.core.JsonGenerator" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::isEnabled(com.fasterxml.jackson.core.JsonGenerator$Feature):boolean" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::getFeatureMask():int" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::setFeatureMask(int):com.fasterxml.jackson.core.JsonGenerator" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::useDefaultPrettyPrinter():com.fasterxml.jackson.core.JsonGenerator" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeStartArray():void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeEndArray():void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeStartObject():void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeEndObject():void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeFieldName(java.lang.String):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeFieldName(com.fasterxml.jackson.core.SerializableString):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeString(java.lang.String):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeString(char[], int, int):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeString(com.fasterxml.jackson.core.SerializableString):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeRawUTF8String(byte[], int, int):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeUTF8String(byte[], int, int):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeRaw(java.lang.String):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeRaw(java.lang.String, int, int):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeRaw(char[], int, int):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeRaw(char):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeRawValue(java.lang.String):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeRawValue(java.lang.String, int, int):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeRawValue(char[], int, int):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeBinary(com.fasterxml.jackson.core.Base64Variant, byte[], int, int):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeBinary(com.fasterxml.jackson.core.Base64Variant, java.io.InputStream, int):int" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeNumber(int):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeNumber(long):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeNumber(java.math.BigInteger):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeNumber(double):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeNumber(float):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeNumber(java.math.BigDecimal):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeNumber(java.lang.String):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeBoolean(boolean):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeNull():void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeObject(java.lang.Object):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::writeTree(com.fasterxml.jackson.core.TreeNode):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::getOutputContext():com.fasterxml.jackson.core.JsonStreamContext" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::flush():void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::close():void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonGeneratorDelegate::isClosed():boolean" />
</instance>
<instance>
<role name="Component" element="com.fasterxml.jackson.core.JsonParser" />
<role name="Decorator" element="com.fasterxml.jackson.core.util.JsonParserDelegate" />
<role name="component" element="com.fasterxml.jackson.core.util.JsonParserDelegate::delegate:com.fasterxml.jackson.core.JsonParser" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::setCodec(com.fasterxml.jackson.core.ObjectCodec):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getCodec():com.fasterxml.jackson.core.ObjectCodec" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::version():com.fasterxml.jackson.core.Version" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::close():void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::isClosed():boolean" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::clearCurrentToken():void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getLastClearedToken():com.fasterxml.jackson.core.JsonToken" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::overrideCurrentName(java.lang.String):void" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getParsingContext():com.fasterxml.jackson.core.JsonStreamContext" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getCurrentToken():com.fasterxml.jackson.core.JsonToken" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getCurrentTokenId():int" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getCurrentName():java.lang.String" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getCurrentLocation():com.fasterxml.jackson.core.JsonLocation" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getTokenLocation():com.fasterxml.jackson.core.JsonLocation" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::hasCurrentToken():boolean" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::hasTokenId(int):boolean" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::hasToken(com.fasterxml.jackson.core.JsonToken):boolean" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getText():java.lang.String" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::hasTextCharacters():boolean" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getTextCharacters():char[]" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getTextLength():int" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getTextOffset():int" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getBigIntegerValue():java.math.BigInteger" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getDecimalValue():java.math.BigDecimal" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getDoubleValue():double" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getFloatValue():float" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getIntValue():int" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getLongValue():long" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getNumberType():com.fasterxml.jackson.core.JsonParser$NumberType" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getNumberValue():java.lang.Number" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getValueAsString(java.lang.String):java.lang.String" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::getBinaryValue(com.fasterxml.jackson.core.Base64Variant):byte[]" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::nextToken():com.fasterxml.jackson.core.JsonToken" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::nextValue():com.fasterxml.jackson.core.JsonToken" />
<role name="Operation()" element="com.fasterxml.jackson.core.util.JsonParserDelegate::skipChildren():com.fasterxml.jackson.core.JsonParser" />
</instance>
</pattern>
<pattern name="Observer" />
<pattern name="State">
<instance>
<role name="Context" element="com.fasterxml.jackson.core.JsonFactory" />
<role name="State" element="com.fasterxml.jackson.core.io.InputDecorator" />
<role name="state" element="com.fasterxml.jackson.core.JsonFactory::_inputDecorator:com.fasterxml.jackson.core.io.InputDecorator" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::createParser(byte[]):com.fasterxml.jackson.core.JsonParser" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::createParser(byte[], int, int):com.fasterxml.jackson.core.JsonParser" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::_decorate(java.io.InputStream, com.fasterxml.jackson.core.io.IOContext):java.io.InputStream" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::_decorate(java.io.Reader, com.fasterxml.jackson.core.io.IOContext):java.io.Reader" />
</instance>
<instance>
<role name="Context" element="com.fasterxml.jackson.core.JsonFactory" />
<role name="State" element="com.fasterxml.jackson.core.io.OutputDecorator" />
<role name="state" element="com.fasterxml.jackson.core.JsonFactory::_outputDecorator:com.fasterxml.jackson.core.io.OutputDecorator" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::_decorate(java.io.OutputStream, com.fasterxml.jackson.core.io.IOContext):java.io.OutputStream" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::_decorate(java.io.Writer, com.fasterxml.jackson.core.io.IOContext):java.io.Writer" />
</instance>
<instance>
<role name="Context" element="com.fasterxml.jackson.core.JsonFactory" />
<role name="State" element="com.fasterxml.jackson.core.SerializableString" />
<role name="state" element="com.fasterxml.jackson.core.JsonFactory::_rootValueSeparator:com.fasterxml.jackson.core.SerializableString" />
<role name="Request()" element="com.fasterxml.jackson.core.JsonFactory::getRootValueSeparator():java.lang.String" />
</instance>
<instance>
<role name="Context" element="com.fasterxml.jackson.core.json.WriterBasedJsonGenerator" />
<role name="State" element="com.fasterxml.jackson.core.SerializableString" />
<role name="state" element="com.fasterxml.jackson.core.json.WriterBasedJsonGenerator::_currentEscape:com.fasterxml.jackson.core.SerializableString" />
<role name="Request()" element="com.fasterxml.jackson.core.json.WriterBasedJsonGenerator::_prependOrWriteCharacterEscape(char, int):void" />
<role name="Request()" element="com.fasterxml.jackson.core.json.WriterBasedJsonGenerator::_prependOrWriteCharacterEscape(char[], int, int, char, int):int" />
<role name="Request()" element="com.fasterxml.jackson.core.json.WriterBasedJsonGenerator::_appendCharacterEscape(char, int):void" />
</instance>
<instance>
<role name="Context" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter" />
<role name="State" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter$Indenter" />
<role name="state" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::_objectIndenter:com.fasterxml.jackson.core.util.DefaultPrettyPrinter$Indenter" />
<role name="state" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::_arrayIndenter:com.fasterxml.jackson.core.util.DefaultPrettyPrinter$Indenter" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeStartObject(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::beforeObjectEntries(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeObjectEntrySeparator(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeEndObject(com.fasterxml.jackson.core.JsonGenerator, int):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeStartArray(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::beforeArrayValues(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeArrayValueSeparator(com.fasterxml.jackson.core.JsonGenerator):void" />
<role name="Request()" element="com.fasterxml.jackson.core.util.DefaultPrettyPrinter::writeEndArray(com.fasterxml.jackson.core.JsonGenerator, int):void" />
</instance>
</pattern>
<pattern name="Strategy" />
<pattern name="Bridge">
<instance>
<role name="Implementor" element="com.fasterxml.jackson.core.io.CharacterEscapes" />
<role name="Abstraction" element="com.fasterxml.jackson.core.json.JsonGeneratorImpl" />
<role name="implementor" element="com.fasterxml.jackson.core.json.JsonGeneratorImpl::_characterEscapes:com.fasterxml.jackson.core.io.CharacterEscapes" />
<role name="Operation()" element="com.fasterxml.jackson.core.json.JsonGeneratorImpl::setCharacterEscapes(com.fasterxml.jackson.core.io.CharacterEscapes):com.fasterxml.jackson.core.JsonGenerator" />
</instance>
</pattern>
<pattern name="Template Method">
<instance>
<role name="AbstractClass" element="com.fasterxml.jackson.core.io.doubleparser.AbstractFloatingPointBitsFromCharSequence" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.io.doubleparser.AbstractFloatingPointBitsFromCharSequence::parseDecFloatLiteral(java.lang.CharSequence, int, int, int, boolean, boolean):long" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.io.doubleparser.AbstractFloatingPointBitsFromCharSequence::parseHexFloatLiteral(java.lang.CharSequence, int, int, int, boolean):long" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.io.doubleparser.AbstractFloatingPointBitsFromCharSequence::parseInfinity(java.lang.CharSequence, int, int, boolean):long" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.io.doubleparser.AbstractFloatingPointBitsFromCharSequence::parseNaN(java.lang.CharSequence, int, int):long" />
</instance>
<instance>
<role name="AbstractClass" element="com.fasterxml.jackson.core.io.doubleparser.AbstractFloatingPointBitsFromCharArray" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.io.doubleparser.AbstractFloatingPointBitsFromCharArray::parseDecFloatLiteral(char[], int, int, int, boolean, boolean):long" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.io.doubleparser.AbstractFloatingPointBitsFromCharArray::parseHexFloatLiteral(char[], int, int, int, boolean):long" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.io.doubleparser.AbstractFloatingPointBitsFromCharArray::parseInfinity(char[], int, int, boolean):long" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.io.doubleparser.AbstractFloatingPointBitsFromCharArray::parseNaN(char[], int, int):long" />
</instance>
<instance>
<role name="AbstractClass" element="com.fasterxml.jackson.core.JsonStreamContext" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonStreamContext::hasCurrentName():boolean" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonStreamContext::toString():java.lang.String" />
</instance>
<instance>
<role name="AbstractClass" element="com.fasterxml.jackson.core.JsonGenerator" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::getCurrentValue():java.lang.Object" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::setCurrentValue(java.lang.Object):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::configure(com.fasterxml.jackson.core.JsonGenerator$Feature, boolean):com.fasterxml.jackson.core.JsonGenerator" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::isEnabled(com.fasterxml.jackson.core.StreamWriteFeature):boolean" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::overrideStdFeatures(int, int):com.fasterxml.jackson.core.JsonGenerator" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeStartArray(int):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeStartArray(java.lang.Object):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeStartObject(java.lang.Object):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeFieldId(long):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeArray(int[], int, int):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeArray(long[], int, int):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeArray(double[], int, int):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeArray(java.lang.String[], int, int):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeRaw(com.fasterxml.jackson.core.SerializableString):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeRawValue(com.fasterxml.jackson.core.SerializableString):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeBinary(byte[], int, int):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeBinary(byte[]):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeBinary(java.io.InputStream, int):int" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeNumber(short):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeNumber(char[], int, int):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeEmbeddedObject(java.lang.Object):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeTypePrefix(com.fasterxml.jackson.core.type.WritableTypeId):com.fasterxml.jackson.core.type.WritableTypeId" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeTypeSuffix(com.fasterxml.jackson.core.type.WritableTypeId):com.fasterxml.jackson.core.type.WritableTypeId" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writePOJO(java.lang.Object):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeBinaryField(java.lang.String, byte[]):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeBooleanField(java.lang.String, boolean):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeNullField(java.lang.String):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeStringField(java.lang.String, java.lang.String):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeNumberField(java.lang.String, short):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeNumberField(java.lang.String, int):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeNumberField(java.lang.String, long):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeNumberField(java.lang.String, java.math.BigInteger):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeNumberField(java.lang.String, float):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeNumberField(java.lang.String, double):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeNumberField(java.lang.String, java.math.BigDecimal):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeArrayFieldStart(java.lang.String):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeObjectFieldStart(java.lang.String):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::writeObjectField(java.lang.String, java.lang.Object):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::copyCurrentEvent(com.fasterxml.jackson.core.JsonParser):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::copyCurrentStructure(com.fasterxml.jackson.core.JsonParser):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::_copyCurrentContents(com.fasterxml.jackson.core.JsonParser):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonGenerator::_writeSimpleObject(java.lang.Object):void" />
</instance>
<instance>
<role name="AbstractClass" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::nextToken():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishToken():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startDocument(int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishBOM(int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startFieldNameAfterComma(int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startValueExpectComma(int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startValueExpectColon(int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_skipWS(int):int" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startSlashComment(int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishHashComment(int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishCppComment(int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishCComment(int, boolean):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startAfterComment(int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startFalseToken():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startTrueToken():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startNullToken():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishKeywordToken(java.lang.String, int, com.fasterxml.jackson.core.JsonToken):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishNonStdToken(int, int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishErrorToken():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startPositiveNumber(int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startNegativeNumber():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startPositiveNumber():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startNumberLeadingZero():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishNumberLeadingZeroes():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishNumberLeadingPosNegZeroes(boolean):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishNumberIntegralPart(char[], int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startFloat(char[], int, int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishFloatFraction():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishFloatExponent(boolean, int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_fastParseName():java.lang.String" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_parseMediumName(int, int):java.lang.String" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_parseMediumName2(int, int, int):java.lang.String" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_parseEscapedName(int, int, int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishUnquotedName(int, int, int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishAposName(int, int, int):com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_decodeSplitEscaped(int, int):int" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startString():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishRegularString():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_startAposString():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_finishAposString():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_decodeSplitMultiByte(int, int, boolean):boolean" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_decodeSplitUTF8_3(int, int, int):boolean" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_decodeSplitUTF8_4(int, int, int):boolean" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.json.async.NonBlockingUtf8JsonParserBase::_decodeFastCharEscape():int" />
</instance>
<instance>
<role name="AbstractClass" element="com.fasterxml.jackson.core.type.ResolvedType" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.type.ResolvedType::isReferenceType():boolean" />
</instance>
<instance>
<role name="AbstractClass" element="com.fasterxml.jackson.core.JsonParser" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::currentLocation():com.fasterxml.jackson.core.JsonLocation" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::currentTokenLocation():com.fasterxml.jackson.core.JsonLocation" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::getCurrentValue():java.lang.Object" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::setCurrentValue(java.lang.Object):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::nextFieldName(com.fasterxml.jackson.core.SerializableString):boolean" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::nextFieldName():java.lang.String" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::nextTextValue():java.lang.String" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::nextIntValue(int):int" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::nextLongValue(long):long" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::nextBooleanValue():java.lang.Boolean" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::currentToken():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::currentTokenId():int" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::currentName():java.lang.String" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::getText(java.io.Writer):int" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::getNumberValueExact():java.lang.Number" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::getByteValue():byte" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::getShortValue():short" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::getBinaryValue():byte[]" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::getValueAsString():java.lang.String" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.JsonParser::_codec():com.fasterxml.jackson.core.ObjectCodec" />
</instance>
<instance>
<role name="AbstractClass" element="com.fasterxml.jackson.core.base.ParserBase" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.ParserBase::close():void" />
</instance>
<instance>
<role name="AbstractClass" element="com.fasterxml.jackson.core.base.GeneratorBase" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.GeneratorBase::writeRawValue(java.lang.String):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.GeneratorBase::writeRawValue(java.lang.String, int, int):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.GeneratorBase::writeRawValue(char[], int, int):void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.GeneratorBase::writeRawValue(com.fasterxml.jackson.core.SerializableString):void" />
</instance>
<instance>
<role name="AbstractClass" element="com.fasterxml.jackson.core.base.ParserMinimalBase" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.ParserMinimalBase::nextValue():com.fasterxml.jackson.core.JsonToken" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.ParserMinimalBase::skipChildren():com.fasterxml.jackson.core.JsonParser" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.ParserMinimalBase::getValueAsBoolean(boolean):boolean" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.ParserMinimalBase::getValueAsInt(int):int" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.ParserMinimalBase::getValueAsLong(long):long" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.ParserMinimalBase::getValueAsDouble(double):double" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.ParserMinimalBase::getValueAsString(java.lang.String):java.lang.String" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.ParserMinimalBase::reportOverflowInt():void" />
<role name="TemplateMethod()" element="com.fasterxml.jackson.core.base.ParserMinimalBase::reportOverflowLong():void" />
</instance>
</pattern>
<pattern name="Visitor" />
<pattern name="Proxy" />
<pattern name="Proxy2" />
<pattern name="Chain of Responsibility" />
</system>

BIN
report.pdf Normal file

Binary file not shown.

70
report.tex Normal file
View file

@ -0,0 +1,70 @@
% vim: set ts=2 sw=2 et tw=80:
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[margin=2cm]{geometry}
\usepackage{hyperref}
\title{Assginment 1 -- Software Design and Modelling}
\author{Volodymyr Karpenko \and Claudio Maggioni}
\begin{document}
\maketitle
\section{Project selection process}
We need to find a project that is a single unit in terms of compilation
modules\footnote{A problem for Pattern4J as compiled \texttt{.class} files are
distributed across several directories and would have to be merged manually for
analyzing them}
self contained and with as little external dependencies as possible to ease the
analysis project. Additionally, it would be nice if we choose a project that we
already know as library clients.
\subsection {Projects Considered}
\begin{description}
\item[vavr-io/vavr] a Java library for functional programming, discarded as
the project is less than 20K LOC and doesn't meet the selection criteria;
\item[bitcoin4j/bitcoin4j] a Java implementation of the bitcoin protocol,
discarded as the project is distributed in several subprojects;
\item[FasterXML/jackson-core] a popular Java JSON serialization and
deserialization library. This repository contains the \textit{core}
component of the library, i.e. the library abstractions and interface to
support additional modules and the main JSON serialization and
deserialization capabilities. We chose this library because it meets the
selection criteria, it doesn't rely on external components for its
execution, and its project structure uses a single Maven module for its
sources and thus easy to analyze.
\end{description}
Therefore we chose \textbf{FasterXML/jackson-core}, specifically the sources
under the git tag \texttt{jackson-core-2.13.4}, the latest stable version of the
library at this time.
\section{Analysis}
We use
\href{https://users.encs.concordia.ca/~nikolaos/pattern\_detection.html}{\textit{Pattern4}}
as a pattern detection tool. This tool needs compiled \texttt{.class} files in
order to perform analysis. Therefore, as \texttt{jackson-core} is a standard
Maven project, we compile the sources using the command \texttt{mvn clean
compile}. The \texttt{pom.xml} of the library specifies Java 1.6 as a
compilation target, which is not supported by JDK 17 or above. We used JDK 11
instead, as it is the previous LTS version.
An XML dump of the \textit{Pattern4j} analysis results are included in the
submission as the file \texttt{analysis.xml}.
\subsection{Comments}
\begin{itemize}
\item Lots of false positives for the Singleton pattern. Example,
com.fasterxml.jackson.core.sym.Name1 has a package private constructor and a
public static final instance of it, but reading the documentation the class
represents (short) JSON string literals and therefore is clearly
initialized by client code.
\item TBD
\end{itemize}
\end{document}