package Ġno . nav . e ess i . pens jon . pref ill . arch test Ċ Ċ import Ġcom . t ng tech . arch unit . core . domain . Java Classes Ċ import Ġcom . t ng tech . arch unit . core . importer . Class File Importer Ċ import Ġcom . t ng tech . arch unit . core . importer . Import Option Ċ import Ġcom . t ng tech . arch unit . lang . syntax . Arch Rule Definition . classes Ċ import Ġcom . t ng tech . arch unit . lang . syntax . Arch Rule Definition . no Classes Ċ import Ġcom . t ng tech . arch unit . library . Arch itect ures . layer ed Architecture Ċ import Ġcom . t ng tech . arch unit . library . dependencies . S lices Rule Definition . slices Ċ import Ġno . nav . e ess i . pens jon . E ess i F ag modul Application Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġorg . junit . jupiter . api . Before All Ċ import Ġorg . junit . jupiter . api . Disabled Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . springframework . web . bind . annotation . RestController Ċ Ċ class ĠArchitecture Test Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġroot Ġ= ĠE ess i F ag modul Application :: class . qualified Name !!. replace (" ." Ġ+ ĠE ess i F ag modul Application :: class . simple Name , Ġ"") ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar ĠallClasses : ĠJava Classes ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġproduction Classes : ĠJava Classes ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġtest Classes : ĠJava Classes ĊĊĠĠĠĠĠĠĠ Ġ@ Before All Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġ` extract Ġclasses `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠallClasses Ġ= ĠClass File Importer (). import Packages ( root ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( all Classes . size Ġ> Ġ 2 5 0 , Ġ" San ity Ġcheck Ġon Ġno . Ġof Ġclasses Ġto Ġanalyze ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( all Classes . size Ġ< Ġ 1 1 0 0 , Ġ" San ity Ġcheck Ġon Ġno . Ġof Ġclasses Ġto Ġanalyze ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduction Classes Ġ= ĠClass File Importer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Import Option ( Import Option . DoNot Include Tests ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Import Option ( Import Option . DoNot Include J ars ()) Ġ// eux Ġsk aper Ġproblem er , Ġv ur der er Ġom Ġden ne Ġskal Ġf j ern es ĠpÃ¥ Ġet Ġsen ere Ġtid sp unkt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. import Packages ( root ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Valid ating Ġsize Ġof Ġproduction Class , Ġcurrently : Ġ${ production Classes . size }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( production Classes . size Ġ> Ġ 1 0 0 , Ġ" San ity Ġcheck Ġon Ġno . Ġof Ġclasses Ġto Ġanalyze ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( production Classes . size Ġ< Ġ 8 5 0 , Ġ" San ity Ġcheck Ġon Ġno . Ġof Ġclasses Ġto Ġanalyze ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Classes Ġ= ĠClass File Importer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Import Option { Ġ! Import Option . DoNot Include Tests (). includes ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. import Packages ( root ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( test Classes . size Ġ> Ġ 1 0 0 , Ġ" San ity Ġcheck Ġon Ġno . Ġof Ġclasses Ġto Ġanalyze ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( test Classes . size Ġ< Ġ 6 0 0 , Ġ" San ity Ġcheck Ġon Ġno . Ġof Ġclasses Ġto Ġanalyze ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Disabled ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġarchitecture Ġin Ġdetail `() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġcomponents ĊĠĠĠĠĠĠĠ Ġval Ġhealth Ġ= Ġ" health " ĊĠĠĠĠĠĠĠ Ġval Ġb uc S ed Api Ġ= Ġ" pref ill . api " ĊĠĠĠĠĠĠĠ Ġval Ġpref ill Ġ= Ġ" pref ill " ĊĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= Ġ" pref ill . models " ĊĠĠĠĠĠĠĠ Ġval Ġ ark iv Api Ġ= Ġ" api . ark iv " ĊĠĠĠĠĠĠĠ Ġval Ġgeo Api Ġ= Ġ" api . geo " ĊĠĠĠĠĠĠĠ Ġval Ġperson Api Ġ= Ġ" api . person " ĊĠĠĠĠĠĠĠ Ġval Ġp ens jon Api Ġ= Ġ" api . pens jon " ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġ" config " ĊĠĠĠĠĠĠĠ Ġval Ġk ode ver k Service Ġ= Ġ" services . kode ver k " ĊĠĠĠĠĠĠĠ Ġval Ġgeo Service Ġ= Ġ" services . geo " ĊĠĠĠĠĠĠĠ Ġval Ġp ens jon Service Ġ= Ġ" services . pens jon " ĊĠĠĠĠĠĠĠ Ġval Ġintegration test Ġ= Ġ" integration test " ĊĠĠĠĠĠĠĠ Ġval Ġutils Ġ= Ġ" utils " ĊĠĠĠĠĠĠĠ Ġval Ġved leg g Ġ= Ġ" ved leg g " ĊĠĠĠĠĠĠĠ Ġval Ġsecurity Ġ= Ġ" security " ĊĠĠĠĠĠĠĠ Ġval Ġperson Service Ġ= Ġ" person op ps lag . person v 3 " ĊĠĠĠĠĠĠĠ Ġval Ġperson Data Los ning Ġ= Ġ" person op ps lag . p dl " ĊĠĠĠĠĠĠĠ Ġval Ġin nh ent ing Service Ġ= Ġ" f ag modul . pref ill " ĊĊĠĠĠĠĠĠĠ Ġval Ġpackages : ĠMap < String , ĠString > Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . health .." Ġto Ġhealth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . api . ark iv .." Ġto Ġ ark iv Api , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . api . geo .." Ġto Ġgeo Api , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . api . person .." Ġto Ġperson Api , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . api . pens jon .." Ġto Ġp ens jon Api , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . pref ill . api .." Ġto Ġb uc S ed Api , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . pref ill .." Ġto Ġpref ill , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . pref ill . models .." Ġto Ġmodels , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . f ag modul . config .." Ġto Ġconfig , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . config .." Ġto Ġconfig , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . services . kode ver k " Ġto Ġk ode ver k Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . services . geo " Ġto Ġgeo Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . services . pens j ons inform as jon " Ġto Ġp ens jon Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . security .." Ġto Ġsecurity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . integration test .." Ġto Ġintegration test , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . metrics .." Ġto Ġutils , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . utils .." Ġto Ġutils , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . logging .." Ġto Ġutils , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . ved leg g .." Ġto Ġved leg g , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . person op ps lag . p dl " Ġto Ġperson Data Los ning , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . person op ps lag . person v 3 " Ġto Ġperson Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . f ag modul . pref ill .." Ġto Ġin nh ent ing Service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġpackages Ġin Ġeach Ġcomponent Ġ- Ġdefault Ġis Ġthe Ġpackage Ġwith Ġthe Ġcomponent Ġname ĊĠĠĠĠĠĠĠ Ġfun Ġpackages For ( layer : ĠString ) Ġ= Ġpackages . entries . filter Ġ{ Ġit . value Ġ== Ġlayer Ġ}. map Ġ{ Ġit . key Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġ// Ġment ally Ġreplace Ġthe Ġword Ġ" layer " Ġwith Ġ" component ": ĊĠĠĠĠĠĠĠ Ġlayer ed Architecture () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( health ). defined By (* packages For ( health )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( ark iv Api ). defined By (* packages For ( ark iv Api )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( geo Api ). defined By (* packages For ( geo Api )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( person Api ). defined By (* packages For ( person Api )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( pens jon Api ). defined By (* packages For ( pens jon Api )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( bu c S ed Api ). defined By (* packages For ( bu c S ed Api )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( pref ill ). defined By (* packages For ( pref ill )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( models ). defined By (* packages For ( models )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( person Data Los ning ). defined By (* packages For ( person Data Los ning )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( person Service ). defined By (* packages For ( person Service )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( kode ver k Service ). defined By (* packages For ( kode ver k Service )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( geo Service ). defined By (* packages For ( geo Service )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( pens jon Service ). defined By (* packages For ( pens jon Service )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( security ). defined By (* packages For ( security )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( config ). defined By (* packages For ( config )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( utils ). defined By (* packages For ( utils )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( integration test ). defined By (* packages For ( integration test )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( ved leg g ). defined By (* packages For ( ved leg g )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( in nh ent ing Service ). defined By (* packages For ( in nh ent ing Service )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( health ). may Not Be Ac cessed By Any Layer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( geo Api ). may Not Be Ac cessed By Any Layer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( bu c S ed Api ). may Not Be Ac cessed By Any Layer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( pref ill ). may Only Be Ac cessed By Layers ( bu c S ed Api , Ġintegration test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( models ). may Only Be Ac cessed By Layers ( pref ill , Ġb uc S ed Api , Ġp ens jon Api , Ġperson Api , Ġintegration test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( person Data Los ning ). may Only Be Ac cessed By Layers ( config , Ġhealth , Ġperson Api , Ġb uc S ed Api , Ġp ens jon Api , Ġpref ill , Ġmodels , Ġintegration test , Ġin nh ent ing Service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( ved leg g ). may Only Be Ac cessed By Layers ( integration test , Ġin nh ent ing Service , Ġb uc S ed Api ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( geo Service ). may Only Be Ac cessed By Layers ( geo Api , Ġpref ill ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( pens jon Service ). may Only Be Ac cessed By Layers ( health , Ġp ens jon Api , Ġpref ill , Ġb uc S ed Api , Ġperson Api , Ġintegration test ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( config ). may Only Be Ac cessed By Layers ( person Data Los ning ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( security ). may Only Be Ac cessed By Layers ( config , Ġhealth , Ġved leg g , Ġp ens jon Service , Ġperson Data Los ning , Ġperson Service , Ġk ode ver k Service , Ġintegration test ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( all Classes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Disabled ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` main Ġlayers Ġcheck `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfrontend API Ġ= Ġ" Frontend ĠAPI " ĊĠĠĠĠĠĠĠ Ġval Ġpref ill Core Ġ= Ġ" Pref ill " ĊĠĠĠĠĠĠĠ Ġval Ġintegration test Ġ= Ġ" Integration Ġtests " ĊĠĠĠĠĠĠĠ Ġval Ġservices Ġ= Ġ" Services " ĊĠĠĠĠĠĠĠ Ġval Ġsupport Ġ= Ġ" Support " ĊĠĠĠĠĠĠĠ Ġval Ġved leg g Ġ=" V ed leg g " ĊĠĠĠĠĠĠĠ Ġval Ġperson op ps lag Ġ= Ġ" Person op ps lag " ĊĠĠĠĠĠĠĠ Ġval Ġe ux model Ġ= Ġ" eux model " ĊĠĠĠĠĠĠĠ Ġval Ġstat ist ikk Ġ= Ġ" stat ist ikk " ĊĠĠĠĠĠĠĠ Ġlayer ed Architecture () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( frontend API ). defined By ("$ root . api .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( pref ill Core ). defined By ("$ root . pref ill .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( integration test ). defined By ("$ root . integration test .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( services ). defined By ("$ root . services .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( person op ps lag ). defined By ("$ root . person op ps lag .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( ved leg g ). defined By ("$ root . ved leg g .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( eux model ). defined By ("$ root . eux . model .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( stat ist ikk ). defined By ("$ root . stat ist ikk .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer ( support ). defined By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . metrics .. ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . security .. ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . config .. ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . logging .. ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ root . utils .." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( frontend API ). may Not Be Ac cessed By Any Layer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( pref ill Core ). may Only Be Ac cessed By Layers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrontend API , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintegration test , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( services ). may Only Be Ac cessed By Layers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrontend API , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref ill Core , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintegration test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer ( support ). may Only Be Ac cessed By Layers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrontend API , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref ill Core , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperson op ps lag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġved leg g , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintegration test , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ux model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat ist ikk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( all Classes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` pref ill Ġstructure Ġtest `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpref ill Root Ġ= Ġ"$ root . pref ill " ĊĊĠĠĠĠĠĠĠ Ġprintln (" root ->$ pref ill Root ") ĊĊĠĠĠĠĠĠĠ Ġlayer ed Architecture () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer (" pref ill "). defined By ("$ pref ill Root .. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer (" sed "). defined By ("$ pref ill Root . sed .. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer (" person "). defined By ("$ pref ill Root . person .. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layer (" models "). defined By ("$ pref ill Root . models .. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer (" sed "). may Only Be Ac cessed By Layers (" pref ill ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer (" person "). may Only Be Ac cessed By Layers (" sed ", Ġ" pref ill ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Layer (" models "). may Only Be Ac cessed By Layers (" sed ", Ġ" person ", Ġ" pref ill ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( production Classes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Disabled ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` no Ġcycles Ġon Ġtop Ġlevel `() Ġ{ ĊĠĠĠĠĠĠĠ Ġslices () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matching ("$ root .(* ) .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. should (). be Free Of Cycles () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( all Classes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` no Ġcycles Ġon Ġany Ġlevel Ġfor Ġproduction Ġclasses `() Ġ{ ĊĠĠĠĠĠĠĠ Ġslices () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matching ("$ root .. (* )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. should (). be Free Of Cycles () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( production Classes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` controllers Ġshould Ġhave ĠRest Controller - annotation `() Ġ{ ĊĠĠĠĠĠĠĠ Ġclasses (). that () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. have Simple Name Ending With (" Controller ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. should (). be Annotated With ( RestController :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( all Classes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Disabled ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` controllers Ġshould Ġnot Ġcall Ġeach Ġother `() Ġ{ ĊĠĠĠĠĠĠĠ Ġclasses (). that () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. are Annotated With ( RestController :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. should (). only Be Ac cessed (). by Classes That (). are Not Annotated With ( RestController :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. because (" Controllers Ġshould Ġnot Ġcall Ġeach Ġother ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( all Classes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` tests Ġshould Ġassert , Ġnot Ġlog `() Ġ{ ĊĠĠĠĠĠĠĠ Ġno Classes (). that (). have Name Not Matching (" .* \\. logging \\ .. * ") Ġ// Ġwe Ġallow Ġusing Ġs lf 4 j Ġin Ġthe Ġlogging - package ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. should (). depend On Classes That (). res ide In AP ackage (" org . slf 4 j .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. because (" Test Ġshould Ġassert , Ġnot Ġlog ; Ġafter Ġyou Ġmade Ġyour Ġtest Ġthe Ġlogs Ġwill Ġnot Ġbe Ġchecked ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( test Classes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Disabled ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Spring Ġsingleton Ġcomponents Ġshould Ġnot Ġhave Ġmutable Ġinstance Ġfields `() Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠ Ġclass ĠSpring Ster e otype Annotation : Descri bed Predicate < Java Annotation >(" Spring Ġcomponent Ġannotation ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( input : ĠJava Annotation ?) Ġ= Ġinput Ġ!= Ġnull Ġ&& Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input . raw Type . packageName . startsWith (" org . springframework . stereotype ") Ġ|| Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . raw Type . is Equivalent To ( RestController :: class . java )) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġspring Ster e otype Ġ= ĠSpring Ster e otype Annotation () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġno Methods (). that () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. have Name Matching (" set [ A - Z ]+ .* ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and (). do Not Have Raw Parameter Types ( Metrics Helper . Metric :: class . java ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and (). are Declared In Classes That (). are Not Annotated With ( Scope :: class . java ) Ġ// ĠIf Ġscope Ġis Ġnot Ġsingleton Ġit Ġmight Ġbe Ġok Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and (). are Declared In Classes That (). have Name Not Matching (" .* ( STS Service | Template | Config )") Ġ// Ġthese Ġuse Ġsetter Ġinjection Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. should (). be Declared In Classes That (). are Annotated With ( spring Ster e otype ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. because (" Spring - components Ġ( usually Ġsing letons ) Ġmust Ġnot Ġhave Ġmutable Ġinstance Ġfields Ġ" Ġ+ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" as Ġthey Ġcan Ġeasily Ġbe Ġmis used Ġand Ġcreate Ġ' race Ġconditions '") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( production Classes ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġno Fields (). that () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. are Not Final () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and (). do Not Have Raw Type ( Metrics Helper . Metric :: class . java ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and (). are Declared In Classes That (). are Not Annotated With ( Scope :: class . java )// ĠIf Ġscope Ġis Ġnot Ġsingleton Ġit Ġmight Ġbe Ġok Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and (). are Declared In Classes That (). have Name Not Matching (" .* ( STS Service | Template | Config )") Ġ// Ġthese Ġuse Ġsetter Ġinjection Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. should (). be Declared In Classes That (). are Annotated With ( spring Ster e otype ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. because (" Spring - components Ġ( usually Ġsing letons ) Ġmust Ġnot Ġhave Ġmutable Ġinstance Ġfields Ġ" Ġ+ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" as Ġthey Ġcan Ġeasily Ġbe Ġmis used Ġand Ġcreate Ġ' race Ġconditions '") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( production Classes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Disabled ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` No Ġtest Ġclasses Ġshould Ġuse Ġinheritance `() Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġclass ĠTest Support Classes : Descri bed Predicate < Java Class >(" test Ġsupport Ġclasses ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( input : ĠJava Class ?) Ġ= Ġinput Ġ!= Ġnull Ġ&& Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(! input . simple Name . endsWith (" Test ") Ġ&& Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(! input . simple Name . endsWith (" Tests ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġinput . name Ġ!= Ġ" java . lang . Object ")) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġno Classes (). that (). have Simple Name Ending With (" Test "). or (). have Simple Name Ending With (" Tests ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. should (). be Assignable To ( Test Support Classes ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. because (" it Ġis Ġhard Ġto Ġunderstand Ġthe Ġlogic Ġof Ġtests Ġthat Ġinherit Ġfrom Ġother Ġclasses .") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check ( test Classes ) ĊĠĠĠ Ġ} Ċ } Ċ