/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠJ uni per ĠNetworks , ĠInc . ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ Ċ package Ġnet . j uni per . contr ail . v ro . schema Ċ Ċ import Ġnet . j uni per . contr ail . v ro . config . global Project Info Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ Ċ private Ġfun Ġload X SD Schema From ( path : ĠPath ): ĠNode Ġ{ ĊĠĠĠ Ġval Ġdocument Ġ= ĠDocument BuilderFactory . newInstance (). new Document Builder (). parse ( path . to File ()) ĊĠĠĠ Ġreturn Ġdocument . last Child Ċ } Ċ Ċ private Ġfun ĠString . build Comments (): ĠList < Id l Comment > Ġ= ĊĠĠĠ Ġreplace ( if map Header Pattern , Ġ"") ĊĠĠĠĠĠĠĠ Ġ. split ( comment Entry Separator ) ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . to Comment Object () Ġ} Ċ Ċ private Ġfun ĠString . to Comment Object (): ĠI dl Comment ? Ġ= Ġwhen Ġ( comment Type ) Ġ{ ĊĠĠĠ Ġid l Link Ġ-> ĠLink ( this ) ĊĠĠĠ Ġid l Property Ġ-> ĠProperty ( this ) ĊĠĠĠ Ġid l List Property Ġ-> ĠList Property ( this ) ĊĠĠĠ Ġelse Ġ-> Ġnull Ċ } Ċ Ċ private Ġfun Ġextract Included Schema Path ( it : ĠNode , Ġpath : ĠPath ): ĠPath Ġ{ ĊĠĠĠ Ġval Ġrelative Path Ġ= Ġit . attribute Value ( schema Location ) Ġ?: ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Required Ġattribute Ġ$ schema Location Ġnot Ġfound .") ĊĠĠĠ Ġprintln (" In cluding Ġextra Ġschema Ġ$ relative Path ") ĊĠĠĠ Ġval Ġparent Directory Ġ= Ġpath . parent . toString () ĊĠĠĠ Ġreturn ĠPaths . get ( parent Directory , Ġrelative Path ) Ċ } Ċ Ċ fun Ġbuild Schema ( path : ĠPath ): ĠSchema Ġ{ ĊĠĠĠ Ġval Ġroot Node Ġ= Ġload X SD Schema From ( path ) ĊĠĠĠ Ġval Ġschema Children Ġ= Ġroot Node . children ĊĊĠĠĠ Ġval Ġcomplex Types Ġ= Ġschema Children . filter Ġ{ Ġit . nodeName Ġ== Ġx sd Complex Type Ġ}. toSet () ĊĠĠĠ Ġval Ġsimple Types Ġ= Ġschema Children . filter Ġ{ Ġit . nodeName Ġ== Ġx sd Simple Type Ġ}. toSet () ĊĠĠĠ Ġval Ġelements Ġ= Ġschema Children . filter Ġ{ Ġit . nodeName Ġ== Ġx sd Element Ġ}. toSet () ĊĠĠĠ Ġval Ġcomments Ġ= Ġschema Children . filter Ġ{ Ġit . nodeName Ġ== Ġcomment Name Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . node Value . build Comments () Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatten (). toSet () ĊĊĠĠĠ Ġval Ġincludes Ġ= Ġschema Children . filter Ġ{ Ġit . nodeName Ġ== Ġx sd Include Ġ} ĊĠĠĠ Ġval Ġincluded Schemas Ġ= Ġincludes . map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschema Path Ġ= Ġextract Included Schema Path ( it , Ġpath ) ĊĠĠĠĠĠĠĠ Ġbuild Schema ( schema Path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġschema Ġ= ĠSchema ( complex Types , Ġsimple Types , Ġelements , Ġcomments ) ĊĠĠĠ Ġreturn Ġincluded Schemas . fold ( schema ) Ġ{ Ġaccumulated , Ġnext Ġ-> Ġaccumulated Ġ+ Ġnext Ġ} Ċ } Ċ Ċ class ĠSchema ( ĊĠĠĠ Ġval Ġcomplex Types : ĠSet < Node >, ĊĠĠĠ Ġval Ġsimple Types : ĠSet < Node >, ĊĠĠĠ Ġval Ġelements : ĠSet < Node >, ĊĠĠĠ Ġval Ġcomments : ĠSet < Id l Comment > Ċ ) Ġ{ ĊĠĠĠ Ġval Ġproperty Comments : ĠSequence < Property > Ġget () Ġ= ĊĠĠĠĠĠĠĠ Ġcomments . as Sequence (). map Ġ{ Ġit Ġas ? ĠProperty Ġ}. filter NotNull () ĊĊĠĠĠ Ġval Ġlink Comments : ĠSequence < Link > Ġget () Ġ= ĊĠĠĠĠĠĠĠ Ġcomments . as Sequence (). map Ġ{ Ġit Ġas ? ĠLink Ġ}. filter NotNull () ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠSchema ) Ġ= ĠSchema ( ĊĠĠĠĠĠĠĠ Ġcomplex Types Ġ+ Ġother . complex Types , ĊĠĠĠĠĠĠĠ Ġsimple Types Ġ+ Ġother . simple Types , ĊĠĠĠĠĠĠĠ Ġelements Ġ+ Ġother . elements , ĊĠĠĠĠĠĠĠ Ġcomments Ġ+ Ġother . comments ĊĠĠĠ Ġ) Ċ } Ċ Ċ val Ġdefault Schema Ġ= Ġbuild Schema ( Paths . get ( global Project Info . schema File )) Ċ