From c25478b29286f82efe4bae9929acafbb01c30108 Mon Sep 17 00:00:00 2001 From: henrietteharmse Date: Sat, 18 Nov 2023 15:19:30 +0000 Subject: [PATCH] Further testing --- docs/SimpleEmployerExample.png | Bin 15177 -> 28222 bytes docs/uml2semantics.qea | Bin 1499136 -> 1499136 bytes .../uml2semantics/model/UMLClassDiagram.scala | 32 +++++---- .../org/uml2semantics/owl/UML2OWLWriter.scala | 52 ++++++++++++++ .../org/uml2semantics/reader/TSVReader.scala | 16 +++-- src/test/resources/Employer - Attributes.tsv | 5 +- src/test/resources/Employer - Classes.tsv | 3 +- src/test/resources/employer.rdf | 64 ++++++++++++++++++ 8 files changed, 150 insertions(+), 22 deletions(-) diff --git a/docs/SimpleEmployerExample.png b/docs/SimpleEmployerExample.png index 4ba5f773336aa2e2b695c56d634e6c7880e8da3e..edd7c375c950cfb51351168f18f465164dd22d32 100644 GIT binary patch literal 28222 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 JmrA}1_#e8puWSGS literal 15177 zcmbVz1z1#3yY8rjh=72Av?)lIE+%TZ3x1q6Cd|M&Y~UVf<_xG4&k)`dgNT}+*=9pTn62auGr`Fpsz*-Lk8xYbK( z2e`SjqqDV(`AZ3BQ!8t@xhec5lccM)oteVu8LtbtVLTNY+jf`|T(Yp@#|jfcw@v zq`7l$yyn51TPFdE6ZT=>l;AG{DwzNA1=3Xp5Qw{583eM}PERdDQs8#+YmwLTs9obg zX$-Dy&~T1d3>%$0rlxfJA|CR9Dam2^SI(=s{^jnl`#F#1RYw7ejXigAj}X^f4%f-w zUDW;*;(j-WD_zsQcPb)zF=m2L2v|N_9a#jKC(f0pi$O%=wCo^f_vLa& ziQ%@teJ4VY<3&F>+HSbKPBulo&wNfsWbIH7)!h4Cj`!U*6lf*swPeEM6M9IrpkS8` zR0+gad{YGip{32WE)vjeX`WC1bvVzy*nE7}e59}{RiSB&+vVw9ynYoIUUBwEgY~+Y zM>5WV(LV3!K<1KgEkDk7n6n{n|2uy?3#GcwZQF2Co6x}B#R?t?Ng|s;T|;v-%G?_? zPc!o7mn^dwq>AQ!nChavI}7pL^rQ|SSyOdcg-;$!Nr_(0%XyW<%3fUaOqSMCE7cj5 zFx8Gp8{0w;S4)FM1p_U1i0yUp5w^O%mM4*G5c7dKR)xltk32m+ z(}mq55r}tnq@WTWdb(e8nhK&3ip6M>6BL^BZ`L%{PD;~KtJ-w(+B_!E;_3|#Q5CwS zH=Z39z0Gm{rFp(ux#0>|C3Gb-KUt(pA-?Gf_mi5p@!BC>2+2J$35DZbuXIT4D}5Kf605hT`8A?B$Rb8spBNl+K#J}g@~D& zD~{h7508G)D0x!iak4q`XXzKCa!QTIp-CAL+IJR<#_2LyRb^^s<8gH=GWpm)gLO!_ z>k?egxtP63lB^s@(o=WR5v85mR+tIXx!UqN+mso%|M7%6r@MC0mNwK!TT@f5{^wi% zp0}@@_s*JA?m4WaDOr53PPPiwzXm@gt@1jxVbgi^ohld=)a3t?oDF|ueh;~=QDLI# z<=$Kk?=O5jSFFgw7wZqn<#}Ps;v5HK!Jk)-Y%S(_ObgD-&Zx6mAc>&Zk%IH`U9$gu z*_M`7JIW7UYZBW;!eA>Pef4EHUjc`+El_c`t%-!g2oRX_-D#J;1U3pK#mCBzf6eXI zy=3cg!zjC8=xsXLAL8@)wkh#dv7da>`a3tOGY%Nq=rZ4;~!GjzHoQk$O5 zyA`PXlE}2DE{&&B`g?VxUhjO!Qh-&?zH8+A-uFzJmUiE6ht;<3`e%t4Gf@FZCNdrx z6fLX48&p)NxiP;tMq-qQoK5%~w>C4gm%D%ek=QS7Mu$m9TYG(L%i6?*fQl+|_)~uH z7M40?{yssx%D&=h4BmCkO^NsA(ORy2Z0BcE4SoIMGQJ07nfWhD9TrTiUW`6^e;HA% ztm5g}SW$6c?0*}dmS*?v-FG)Z&`ijjozLj?^^WtA_Bo*0-@ktco}cz7bC(&^TQpOA zz{oyyLZ=Yv0VNsK+DwEJG7e^n-*=M3zCp3y_*#caeCC(1<+Go8PD0{-xGepNfycgE zc{uXVpFi`>?#4~tSz!D69i%QKxmyM**t9O_W!X|n3>eW;^de#pb{%j-xAz|Vx zJ?FFCY4-)skUf16*&}Dd?KPkaNF=gACH?AmAl~1?(VB^=7b%$Ih03XXmV;@P_4Ss` z&pvc&KpmFF=s+Ke;ah^FAkY=)-wo=2u#f-R^8SAp)I6tnSD0tn(Lq0ySq(+sq@Xoj zLCw^fHa{5_Tea{NWo3`V#`D+H?sTKca?!7~Src?;&#B&$aG2ETIo{yt>&0kptUH*> zj&@@nxiQLd!wEGB*!Jh;*EdgwXf4DQGTmml&=X zY3h{L$RDmO_gRi9WQfZ;@QHRS?^!KY{z^?3;vGcN#jsQsUd6~eXcOwr3@HzILhVT> z)-7=2QH=a0%C}_BgejbcBo6_9vZDL}1AcwBS7-7Xe|l;PSXe8Z&VT8t{>6M96i5*T z6|rhl48^xqlihdBsOQ^FKFTuXTtLI2*r1qc_FnM_pZjWDF2`)rOa`L-c*vj`VvCyH zw(={NQ!;=&}qf_;D_~;9)C>Uy63tWN}2Ls!@(aP`iYtdCiVSkZ+BWKrGxu zSXsJT*b~ZDH@A!7cigvK1`xA*`EMo6BLn1H5N+H#3kZavyj%qQeiG-h_$InMA2J?l zs}g5SXVXHBon_>hhD&DlNwx1K*!gHt6cq_!Mu)^vZ8M55Gn5pkPAMDzPO259b@pP2 z4w~)M`c?ET3ei8H6o=~NAkdkA{^rX|eu+n2f+1qHT6*iN)O=l$h}EIlB4;c6`=0Vb zJi+K;6K)~ST>rzr{$#LsJ9n&Y;>ALGK9}x(T2l!*VWD3Yiw4%i)vf=B-aLH!H4{0G!p zR7FKH-rtOQ2y5If=-eVLi=0BY&v9!HMHL6G3)dB6ixqkApM~MooQU?>O#Bh;Tkh)M ztp!~@Y1A{$<1l(Qa+zyZhy4J0QdRnSkKoO9RO+euR1+^gjvM(r(zHuvhQ2d3Wm3y0 zi+p7OP)mK%7vtl&o7AiMZZ!u}_{TKw#d28&B*#AONdEUYaGROcM(Ov~!@3fX6{K6) z>gn=D7S18rPu}|}jB|R+Bl7x}AH2TbrhexOul&)~wY(rZOxvwYndtX@E$r6jiLq}2 z;;K}PcPtcvI5I`~dS!h;Y*N;@3d`y~Q|}DG*V%2$LU0V>M_=}L50&NIB1L2&xW;K| zJ&6uPZ3`P&@bQgr+wD(f!8th%=(g;q#*Ho?i+mELov=}c+lleM4hDw|5qjk*Pq_pj z9)fB(_#vJECVMIfgqs}hU&Xn zSbgtQJW7YV&DT0Lm?VPi-Z*R{tCtenrhL7y@?a^=Ua_}Z^n7tn??io_StjBNncNn1 zc2>NCJW~kp)58TsT(oS$tUE2*IDBt{OP?x2l}HV4aJ#;&dMCYIe~=kCr^T2kOt98f zc8=Aff>oncFRn54vR={edW9mz%?Fm5)wUU9Sb4#dQysf(JkZ`G7+F-#h z+sc_*;%gS==X4AkO3-AUL5R@jRmReqCo{6)9~m9jZ0E$CIy^fLJqTl-nKRpaS`SSO zxlyIcCO5Ccrp(>#GH|fI@~t=RhmkrMd03461Xomqq?%eidG+g3dHy`IxtL17uJ9EXdie2vT5mPngWu|>RVtpJG}#2ug5GnEB{v00~|km^)54Zc{CgFuKQ zTbnc5q9q_^+l`{|f)MLGQT+xbDnm!d<0}}@eO;!$$?HTI%b==7uBB@--$zx5S+hrD zpigCJR{~VHv#09xElZEdfiOi$F&b&OMI2gFH zf9|s4H5gf3kO_RlZJbt9VhGyL80S>p=-Qu!?RncIvdOE$*T>y{m2+$F$KbNrhGl$i zpd;IT6LQui$bQbl2-X-XYZj3%*tp&ccQJI(J1$oesoOnzmTtreGxo_`qdFC#_Ow1| zP=r7pCGP%4RnUX%zdJQi^$w|1Jg~&Z9Y33t@AAVv$Ia+fgBm`s|L*VSqn>A;jEPEf zPik@OT>XKr?leu**O;H4rz|KqCk|(cMKF2yd39{bJKZdMJ_t2gJ1t{fKsZa+me$04 z^cne1FHB(SM%THk+g+lF4Vno)%%^fTToyJnYe%?1%*1T-A5A#7^kk9>nx=m#Y1`d< zM~#CD3R_0@k==L}(ngzQ54}6@W>aA;%RxcrV;y*}=@Jpbz8$|kZM)3z1xt1J9hZdT ziQ5muQ4~$8z_2VClL@0kW4X_VJ1Khe;&VoyIzE&J-{>m=q|<_ycZaWBlj!~W*N`tU zgm1lZUkumzdV{MfD~qZ$hFw!ko^@?yjkP!8v2c9j>KFhl7ezs!O0{0iCw@1L@6ub% zgXPW0x*wa)R{;W6dERxNy9H88%iiP8fk6MfpPS^*A z{KJZxmcsMT%}Stsq7A(oNYxEO^Zlf@eK5XLfy$D$U4z*k(FW0MXUenrneE06Fg`wq zz~ugRyC_Mh)zZzcb^~JW2xGuJ@NHYV9(B``y{Ivzp(G=LHQBB>mj4;P=r`)KI_T_! zv>Tkw*N8zNakawlR?II|N@WiW#SJSJKX^$wY}egP5uRI?i9uIR(*5b6FTQPSh82B6 za3Kbz4HHz)?$(H}$KM$AihPR}lNYp>)O=3<&BC;$%ucfLIC@dVIN9eX4{f`DMCSeP zA*omr^-k@3*ov%x3TIw_ATp$ZHIl=fjzvy)qgnKN^K#~VqMB{232Xe@{??RLW zV?brOx4=h7NhOV_c0ULH_KN`xl}$ckNIW4;*t6rc`}Eb#6p?o3UO~_g!v0lbet*X! zg~cI4Qzbb`I?b7*qlJ?W;mE6z+HW5s-nT|xO-KD1?leTDe_WdT$sJBY;${D0uw(dn z4b}#~>q2Wdzl{@C$NQ9mQ67n-o(0NuN;8f2W6R!;Z-u0N%5^K(-{NV2op*QMK<8U7 z09%=`ety(Wmx+S%xmKDUuy4RDp5Z5ZILy~dnV*@I_pM6g6teBKwf_F&`N1d5BaeBJ zdn^c=FIRx5$1*HV!W(Qi9UHVivTMyufbOaG9y{v@OShE3!!E>pJ>ql#uoMbOPq%A? zm|4sYH9ga453Hl%Cl3?o^e^v2G_upK4@MB7TADD32`z_mRx-yc@WEh~Fq}W+Yun2n1o3gOZ^LBTbA@B zey6*fmD3yfPz2R;L@44(b;W9uUeZLHD9Btu1;#X!axic9c5`3;vS8h>i822mOo%^; zy6qsV7S@YP9wRnUHL20=p3LAsZmwMY#G*4jO9B_}VJza`h?!`nf!xS6diIS2salqg z$oyu#@#!OXIPt!!qng)8gL%UR;UzBok?-I4CPeYjve-En#<7VlpwBCYjD}vC@Qev- zWq|LR^}q1v9XIJDgN-Qat&F~p^nU$WT3Aa$!GNihDIy1FGO`ZyaG8!f@L^oIr5$Bn zh6VYQ35YUB8guzCRVrw-8)&r@tvo-xM9&Eb5GFwT`+3MIEn-F8nJQGayyU zhbNbW3_?Y@!n@y}lHhKzqrSC%TrpYvQI7vL7d2ox?iY4Jia$1a-NXtEq-?1vO5m=! zRHD!QFqG-tS=OPqWSX|Vv`)s+ywBCfqm7E=X9R}{9Ba_eTJ|*WduD#&ArMyIcTEk! zTuZ_(c>dh?IVWCT_Wo+%95GYqR}xI6sMZyg=_)uyJ_6JJr_aG@(B*;_>&Ujx!6+9U zi(>IS#0Ngz)PhwNozG;waswA$yN=>q6dosA_YPT?Oe^3@srzd%v$OmAv@xW&h%(eEFd-#^N&r{x!2d zSd5>UFtPU9A6jD=TNKkTWjiSjX`)I2Q}Ry9;%Nj3HI^EgGj(}QrzoCjr9Ni!z!rBQ zww3h8(<%y%r0tCqgK+H9v>{?I2XL+1w79bmWI}MA#<>}9l z(N0J{GNcaLn{H*%D5UlNcJ*K1sogQmDDF02FzP9~;56Ip@(JDCpPOZw0{`-YGHU2B zgSy_K&h80bh!&%z5P|x7QQ#_ZV`BEc{QJ%0d20^rs~L_hsu8mKS7f`fEppc9 z>vfNs7}gYwjl-R92YF0N!W%c?-x`GU6};^>Q|P98MAf!rPEbieNy*%~E9jk)&= z!vmhj{&fq1lST>3d+hX)##Ltu#vNt{J=(K@j7jq|Lh7$~uHjnzvA;z|jiUw`{;83( zWAUSCrpr`mrz*DuilnemNXmoN{76OdZ&!Ai69pDR>VKW*7Nt8l=kueTtyqnse28@A zF;brz#o9l1Rvo96PSmwU06eV5b8eHnGbGM3sL~*wwJ_`f+fuKscwl!eK)*gYX0zCR z`t{N;DAxQ-ms-kj;mhk$(c=eNUv3XF8vth+3LymNw8u{>0CjTbX+Ih31sXW=+aRulXddmMb#xX0NqhzsfBww0?xg#z-Upevu=9x< z^rM>FO2RN6 zQR6+QTxeQq4sZGGS=FGPaVp9!HPvCjr+D*|o~XKAb*jO%1pY0VdH1GLks1t6MGs$N z{gZF+6uaO3>7YG+;Ju;VWG%I@s&jPY>qe30K^+GRt>eCLRIS|;pAZxttvxm;9^PQE zi;IIwfB@@`tnJX!D5Z<{te)`zvGy1)5B>`nUtAdT@1{Zh*5*!3wAUKXg%4P#Z=4}K zkXwawTtD8UtmX7w&J&}^q(Z*x;+`QGfw|rBITV6V^NW1>36}p&5<9la@T%Tu^75-W zOJ!vPVc2pgd#sL~*0ttmeSAiY3gMij`LAtP@l@@l=Lq$d9Vp6IU1cs<-bvpI^90km zI@`(?>CSs(dcIeGCR(d_sHu2b;+kH`qIoq;a|yA#oLq+&F=g5jh0I@)iZ76h%v8?I z3wkxV9|+sS$5 zX#8qbOlM?U6p^7C(AtPD;k6z54UdI>@r1#bpLZ7AYhVaoowpn#MY*zENqR-DN(3UCU z>W?QLQrI^Fu{n9hRz-A#{hZ%vA?%AbGFu~#(SKvO;5;yCY=SZs6&WaXkk-I0zz4Gc zJg}1rw+>!eMH*UKnKWAPu^u;3Y<=n(J% zdA}~dcTHw#`VS;?xP7QyV%o{{YLmsd#Mawm(&jvVJ8dn;;UVKXZJl~V8T)wo#q?6l7@EZ;Yv= z_tLgtk#Pb_QXD)#UY4==Dy35GtnT2IA&CtJ=c2dod!+k>!c@iqG|zb=<$rlpOwcec zMS*QstUnd+!l35;ZONjC#tOm2VIm)JYICkW@LS!rXq{T}Fd(5bb)xuvi{4E`Lq72v zV;cUQzV4}p_<$dmxv_R6qf@;`(GrSv;V)Tyr7_qLzuq_Fx&mjr6TQPxdn|9R9sM-0 zGl)nMMf}-)eXq~#-NLQWIE;}(nV#1NviFgsqsO&;WqPHnm*JzP;&WU)cINlUpxVn+ zHvLU)pE@oc9xlEFWap)_Z!R;&>xJ=;zEe{@T1FvVC<6Q>9VA_Q z`{>0D`xO+FcT5i5zQYswXKLwlX3w!_TNgTOG-T^aVz(CSQRgI|#P58Ddde~JYx%fd zbl+!X{_>t~TTfHI_wCP;MsP0VX=8Q@tJ7z)UEMGv!L`w`JMCc+0~Vv z#Nel!^Yud^Wd%Ee zVe^#NvgHk_u6goD0u(CegBJ6`sYG{|n?9W!p*@K)ZK?+cX2RXm`w?dqm0E0@!a%KF zr^Ore=mMnLnC(2`et5(wW5i#lAy+EgT(UN{Fu}y7U@DB z&8Os|Q+Ljju*8Z55pQ(_wyc_Ew{qd?$jb8VBE#YkGn~AaeD%bit(fBTVx#fJWa{4H z?r>!M5zmsNK;YFh_Hvv5$*Laaz@whCih3u?QST&|JZ#xtA%B|P%Vw1_hn1Fi1T`B@ z`{rF~La0Sqj5tllqmZH{!3_BGNaG6!{`7{J@}EEUMNLh=vi@AOHPrB0vg&9#)aW|B zzg1btK6p!>En=k*mHGyvd3I#JTj{cd8F~JVPj7i;a(damwnX&yym50#_F$`%QjR5; zpAOpU*Ict}Za>Mv>g{^FalJ+m+Nb6xg~CvN8aWnlce68sq-6|m$776i+qUg{oxcVG zk>&s80xW(_!CrHxdXBG-mrenD8&4ine7M9O&k#u|NijHi%UpjDUTl24v|@=zE$UlupsZ?T8owNzTTBgv?zj_Sl!&(B z>0UczMVD>-LB+#DQJ}+?uEK&;#SO}F^tRqWxN;r%AK1rR`kFEUK`dvAgT+?aW zoUCdFGl&1>(L{Y$1zl#FgZ0SPV5`qk#C@d}4bOvaCI?ve*eB?QTzVU56q9!y(uFFeV2N1 zh{MrZgXhq|VB8SyELg=_z}V;67qIzEpR2cLB}dL{M05l_>6k%YPFs3jQg54Xg6R$y zRVB~p?{7D^z-{twe4_d_zm+J2+s)-Nr%X3gG6&3>b%zxJsU6n`V{EA!yiPqoI?-+5=UERj8FZu;#RkrHmm zidb>mb+=!aMg@gx<7ZEc0A}DEDV{D<-utw8&OO+`Gwd^I318Vp$Fii4S%z3|>Ol($X}nSD38QI0A4 zaqiO-_k*>}HfPh(i)_Ao)LtvqWLFGFSDx9;jrT&A!(jaZ339As?u|dyJU1M4u;2Po z;&!*I8P{q=^44hrFuXFs7_!TQElkYm%YueuHXxQiX-}h=+1Lz7oC~F{QIC8?i2^I` z=LZF!yA;>doUD}`MgK}O3_f{ZFDFAsAaBor)tYg8eFxL<@}08p?E0!-I~pKM9ymDs zJn#aO*epgRPn6k@Z`!5d2!F?0v{VO8`M&MEiHwx&%%=@Id~HI4%~HFr-q(Fl={(b~ zkp$nhrKYqryW}GSXhr!YxamCWouXAu$n5VQw|f)iYDPv2HF&15`{;Ua|D4*Ot+Zs* z*EAw>?_03Q;uGR2!vt?tERO>Q$t;~ zi%~5Q_d0?1LJ}?flpDiqr*j$!@9#DaC+90WRPW83DTblIesbSWWeJZY$l>dit5@^7 zr)Y`@wnIUOpV9r@IhgL%`pAk&UEc#rK&d8sdyS|f1t$P~aTK5T8YBx>5^^=%6)$RO z@lmwuH})3?!r#Nv-2)bEm)9q4_nut#F^aL`zCGQkl(U#uo}{E?pFT;4hmHFiP^WO; z)bbeP9fcvqGkGmORb%C6mo5Y5ne8ZbeE+o0;FpQ>G4J3y)&QY%butSOsdwyWwpAR< ze&kgR4UhCHD?9utNT@9AI!8=(-F5r$Zx27t+2yO;MqQ$ezZ5J#Zq@JXlsUHWhF5aU zHZtDT&kEWlK5BaC&pn{-fV?>pwG9Z*^@YbJ(TnwfE0u1}pe85}GmCfy!Gf!fkP z%-OjaA$?p0)@$hN#{jonXFGz2fl+3mN^WX7<~x*~Te@SD@%_O-#DWs+(Twwzp~Xlh zULc8z{WQV7&7?L!j41FI8SU==^V^-7KF|D?!hWj!@zkd|JEJ3M|NOfsL9Yfv)GixP zEjOEf&4tHLPFh+iz)sTB=SjWRhjm7!4s@63RNzWy^6`7yUcAEuN-9#|TDI(bn3Tc5 zVq`}$F;kvKYp@jjm%#SA&y3PZAZ_H=H5n->m8jF9wEVOO z>H%WV;&J1&;q&Kr@khQ_-S2%|_Gj%-Ip@JRtALZgVPCqAiFsRbDCNYV;}SS$M{Lx} zB2M8l)4!^mNaIsyYYn~||)&ihd6!UDZ<`qhmi4Xg19Y7~9J1NRg0 zX{G;S_wc*LrC4CxnM$s_RzYp~>kqp~lrsxA4_3Li*rl#?Q&PV{6*Wv}t7qp_J8utE zR4(pJ>FGT>Wn2R0?3VvFOyJ!#HcKgk>tfcNkiT_HH3_Wd+z{JbE&tNxF+p8lKqs(9 z%Y#M)>+9hKD$YOfy?$*?cK9r%g-S1n%+f9c`kJ=q{FgD2T9qSyFX(x-EgMKt%BDPB zo)=nO#i_T-zjYXE35Z(8b8*vV3M<|20fv&6mK(?ZqWVQ2({V>eV93M``7rb=RTgG8 zY^(^+iy=awVGLjus|JmccQ5O$w&_R=H|%-R7q-7m`4beNTPj+8z8LbKV#g$V;#_S_ zaDS@$)@J6LM9ZMIg&k_N1@7?`nzfi)XRjafsbe+#&J1Yy8PISc(6C(pRwSj7JLN*+ zo_@+#w~BhG0P1)ka<6_rvNcnq+f6Xb7bv+YIWyobm{Sxh^Ww$t$LW;zvoA0&JanCf z_Yj|(Z)K@w*FGcwV@?sj_k)Y99Yx)>HoL7?K^3bfn`*Nc3s#z3D<99hoNO%aS3+^E z0R56@=18On6&=gI-7%FBsD@%kWd{TtJU!2#hDQi^+<2WG0IH)8$irLqg2kH^zq>ej z_TXR)fTRL}lt(a<$HW8aR%V}Q;n4Oa$2r+kn7x^Y$Z2nQ%-j0tTTbt7ZLnfue0{1_#bU*Kt1_7EaNq@%Kf8ca%&UXNyNK4)qzjfvSZ+lpiGK8T35~3(W zv>Y$y;zoJo?Qby0tzNXpY~O>i6@DSYF9KT+c1#=W#-a);aZj>L_>biKrE5_jHjKVq{!fg4A<=5S zQH&hj#|vs;3j{bxzy=m_{8yVFkOEB4Xzfnh?agd!PX;w9Ie8_(bP13zhz!4Fj89C2 zVMSc-9CQJ~!3)HfGZ{OEOunSMIB#D1AGp46CLT`V7p}uQIp*Txd5jfKOmsWoCa6Za znx7FZN4H3S^UmrW=MNm&P2~adJ!6Aa{-XIE`}*LH)%Eacc1#{ghiy^-OU+-ced(d1 zu6^w=;Kr8aTT#nvBw(3iT@X3@)AYW<7~o@NQ8{a5J{P~`KbsQtJHYeu8;;-8&&qy5 zPCk&jH`38-w~=wN=&Ar91 zwD=<671e@(f~acP;?34z7h!O%y=lK2+wkwFPxS{f_&NvkuQR0N^-%tR$tXlS_Sy_7 z7`h9W7uk7to?$=a0EkdTu6bX=m^hWSnVH9*=D3*AD!)iRI~_DGp~TdouyDl;am(f> z>4dRxJ#h3>m%BgNx~YkJ5uYQBZBZ)WIDD89bJ8K_*J?+_O3&_Z#r^MBcK`T&-P4iX zv>;iNqa!$_cI5FJcLa9KT|psj?I)b^t*;6)GhVn_8=M8dZ*((om?)0lm}?Z8;&3Hq zg=&Jcb4b|2jcTsG`O24AxYrw6uY}J8~@cg_@*A+4(;K&PU=< ze!Pf(42Od_O5$COrN6mY?PesPSDd$FC~gO?i>#S?>j z&=5L$n9)h3+3Bw}^E}v#QMXs;Z|ODVXBWrgyG z*oi8${TH`mL|OvD!oU7Wpu7BezDgR(U~y z!#b6SrU0Sr+N`bLeT)a!w&7(I>YfGugqei8WqUSDejZ}0rI&9tr@g; zxQ$r-6X!=YU`F$iA~^+zJXP}_%yfB(lBS&*!-J)W<0{-k!1z{M#6RH8C9UV9gvneHF3swl-q|M}T8R_G`GYa8npi?b<<<#}MLC?V z9UGzRgq=imbn67sYf}-(=XJ}v?9me!6SlIc1m*{KJT32TDEzcN45{#=WBsSnj9AL% zo}7m&CARXN-`GrBX&mvN!~Z2E|<{KPX9``xSX$7 zN7Z06$_Wm5WV!-tyijphq9RnegAr94KD2=jQHpmR7fcbh8Nn+-D!q26)^Ze~AMzOw z9tug}n^djP0FL??L?w6}{M$RRh~wPt^w2K%u#JDqHOii6FvXQcdGm-Yvc0l7AjwFG zqw@OWl~)D}8j4h^cbt9E2+$0J3Zy0GiVJtley$`FVpZpE#5TliB|qX1MfT{n>p7%|xV^#*DiCDy8dW zz`Oy!CR`JU@2v1&8rumD8%o8dSUarKv!@GsZ}(4Y(6Xq+8z{e+Pes^Tr~u?eH$yPD z!`eZHz+keiEQFzzvOlyOsv*|rw<04H9UoXmiXR@MGyL;}Wz+AP})pY9X1LDlW!hzlDP2Y4l6bZ~1>`Z?29FuUiVGOy>s)dx1 zwGCi^cM8QcXkjb~dde>*QW1S+`CqRFi#7}O;)S-AT`5mx)*`*2P}x0mog&pUC(`+r ziYGjMEAaT^)KhI;CLpR&tpH_iQ&Xzr^9d*POy;i`$|+R>V|!;X6U{Tx<(&KpIx?lN zqGMrsMVIsW&-bT!LBn&_*EjiBk@|ED!q&0_NU`v$@*?=SbT1`QZi=~sO=>b}VqsR6 zno=u^S8h-;R&@JBJP9?slA%VD?CR=OG;{QcZkP2S-=a~jhlk<_^Is9ALDtz&B~D~z z-0B?NOlW|6Np7dDgeQ!@P>Zp6cD!#66MDO-uB?oZTTqwwgs7DNiWAz_&J5GoBVf5I zstli$?;g~CNUkj>;x|D#WkCcF^;OzB5$ME{Drh- zPFVxfmi##s7R{O;M{t3EvI-ST}O8HN5VRJx4g@{NEBsKaj$JumiqrZ;$|ggcle|sSEfHa^}dcR;&W)B?3aBU zr17Yg8ry{#JKJ;W@zed6y=CvTM!7NxA&}gL=|C1C8|wJTCgUPi zjEM3@ym7Na|6(C)zu#VgUjI&K5;}{TNNpC!Qgu&r+0;lC5;3b~I^8kvdXlzocV0VI z7E&tqpSY(`ug!S&u?cn-D6RK-!O~VFQay74%RThy^15Lt;d56eY1R zvP!}92lcC~OzIbqvsC!|uP>;CqHS{hbF#sI05ShP#q}R8Z@zrbL`9D!^z?tz_50hf zX1?+)Rrr(}1NetQJW5h>6wy6ndyL_b<1VM~%33J$p%_deQk*E5>hYVKXoIFf3U^M`dpry7RNl6A(t^Idsg^}~$(2A<eo{;1Paezx?ninN{0R4v%}LCq6@4JRr%0!(d~`{3vL4QDncs3yKESY1r-Ph)ZB z(ZwJQmSi-!YEs6ENPsMzX1#6stWU*B*2@DcUd(&Y>Bl*=y&{+-v-4Zx^swAj?JG^< zG|8Bb{Cud(Jm2HFze^_^>mjEy3IMTRc}59imDE-A1Y6Bd z-NHwxgYR3Jd}H^(AO0TRm1$v<3HR6KMZd;B-5g2ZbN>7Cy`h}QOnxoRY!E0FIGLKa zwf{U*=bw&v)sQ|_E{*r1KJGq}|*9}5fFU`0zsb*nNykQEv5TnTvI8oQ1;xvdvxSda7YfjEZ{o6r}I zXTN(ahwXsbAVt|r?LAWaTTQz4*4nOla_Aug5AB7Y(0DTZ?A>4O03i2xi`W~&fVodz z#bclLKvzJB?SJc>WCS1xVI^X{6%SIF(-zUp|EkL-#nuiWM$W*-U}cy7jd{1STK?IC z=3eYWG$T-Y{{Z8?$f%0c|G9CJ?|3U8AJ59qKBD_34~L$GRdbrVXD7C>oR(${Cys@d zcU)8Vra^Z;MU5Li(whP$nJAkBf|w5G?;ORp=w^d>NPuG%8*_y0=hq+DXS(6l;m&jf zwbQB;k)2=2#;cc?V>X8JDqxGq`3rO&*0QHKz~(Wp!rsnqicQ8C*g7$|H5cZ;7%w|y zz;B%_pSRtckvFa<3ZG`f$YO!3fA^L9w^5HY9s_ABLXsL!P5zaQ{J&Vwf2;AIrD^`B zh5vspXstD1Nr781vJCiw8WfO={;JYqsN4(i5vbe37eOq`i0 zNoOeHBd|vfk7c!1b_I5it~^9mQ3k;nbeBE4APEnnxVQ*%5D_6Ns~#RR``@bWneI;a zbcs$*-|4#Z-~0df-v9C4|F2y6;QOz9@cq{>C-1(Y$0qOo>W997)^-$5BMSe)GK^3- zjk$&W8tX8}nM={N=ppu(Y^m@%T3NUT?I>)&r+v$B^S+uK=p{>nU|6=|nw%nuGA9o! zgPh?QI>$@A>zbw_IIcUrZK^m?9G}{^r#RUW4Rd){voyir6irn*d1P>eGjv7c48sy+ zLAFfGRI7)zN5d>fH8oonI7jwP7$*$#oF$1SXV{*mn64!Yj$S>kEgHx3nj`V1%ju@5 zaI!QcaF*kloNY;_XnCfm*i!W{RA#4nf~(sy5X%N9%Z3Qt9EG!0UG-hrR82?ls>iWq zc8*}_ie+%Fu9=*y3Or{>yueAG&FhM(IlN?44`ZTXs^V#a;<_Afioj0L1Q=$ioMlUf zY3Yvanf&}PA2zcPjT0o(a6Q4{Y*T`9DzAaSlEn$|tXjNbI(*F;M zI;?I4R%h!brx}i8@ro*2x-icUxaG==lXOo~9AD<(gf$RTC~~HwTbyI^lE!Pg$!l`; zxNI~|^i-7HteWmX`ah_ylhtwqoZM#YI~LgN2j?O9G#*JbEYea z9PGdAdb}e)Y=9D(-o2VstUy$x@ZOYVNI?Fh8)QhYVNl z&u@DT^NTOtJ2AN!d#V)6>os9N-O)p?2sa-1N2gxHen)X+thgxuLtOJKH?9|TWWl=#7D7d@zB(S z{dA$C@wEyc@(1>jZ_K}y#)G{z36(XGvI+Nnx%!i@m>aAgR^LkH zV};u$yi3{ogRizWKiAsJ$BNobxF1Z=J>>dj#L4ju5$gwfX?D-xzRQYZQ`?3wEspHn zedAZo>h_H-HGRdBWm&E%Xa=W=3ZM-@R-A4CXmMmgbSyz~c}1J94s4mmhmCD*pg#+{ zJ$32sra{#g;IQKWjwVaqmu`00A@?1{;)k0v7fOyF2emZeeR-;fT-r3EXPv>(#aILI z0o>Eq0{ApxJ(=twZ@m7jrI}th)``I>ILhVv2q2Zq26vZaQ3lXu0o*f12LPNba)znM zoCF|OHAG&K;fhdog7>W0FhwRloV@YY4NJjPmXxP_aKqBIqhnLCrn~30v-YBn45F!C za%$(`)YQc2(B7$H_l>1}uaW zHd(=F=H%q~@MzG7$TL!OmYU;(-!Np?YC{$Q%jy8o4Gi-KwIXL&GSAt%rt*%d8?NjG zw;*y;a3@Qi7F@-WHZzglN~{4^1X@O*;72UECb*g*mj(F(nO!%5(IH^GsnPMVlh}v7 zLWClP;4y~mNu=rERfb%;S}}P;mNdB32p&LdX++>mQ&u@iH5A@aWXW;GT0tB#6+FU{ zpP5;iC(*NvAaH`dQc(H?sZW~O_%itbb*conIazXzekOl2keB{FzZI)kU)B+u@aY+IK=ANsdlwAtBYDTb(uo*fL%k)11< z6drR%I3~62eVaHz?%y`BNs{|rc#!1au{X(a7S47vNq&M0$JXJE<< znUJL5hB@*hof#s-EoCt|@xV*ToW%r{D@t$y|EX-7x4H9DFnprob zadZJLUz&nxR?pMqXRjpvM-r#cI<*t^rgP-HNc7y9B@HANF>}`oviPGHWg}>tie~tf(c+kwIL(M1C|hW?cz*ZhIEdi zXo9Z0Do#P1deF&Y5!c5Pu@0{+DlOl~gX>?=1lUl%PcWKns3h8kC_=u<6>JC-LnDxp z^8op%!V(@bNs#lAZDIQ0xpW_~lwK1oJ52TEw$4X_;IVI0U8~9}CxE{7iApVRS?J@% z;JU-qsjEduG^&sU5)GU{8UhJ*72=cUS}ufY9kOTY^i}PLDflGelY&ngKAD;J!}RYa zsC}vDgAAW7B~s7Ne4NjIDAlt(DRhxlMp4c|VCnW9QnUA}x#YUF9Z8WuHao#Q%B(9K z%0HJsJ9ks|_t~xVSLj@3SNgl@(^C7B$CD!1VLIs_T-Cu2^a{(sbP4qCfn`KV1)L2J+`_yV%|8Uetf#;AO>4 zSjPTy-3y&^XF1K{x5&h992*}io_%mtd!3Lr&zq(uX`EviV8Nm^%;~VLoXXp}D)N$K z^EDaEWPo0sR-FtC!{Irmgp%Wr#d!H1r8Pg5XNX`^4Z?|hw7u)ggL3=P5i`4sY<_&P|BZitGxCFB*nqh;>@|wv;kXDyt$ST@lhR2OYt) zHHgAchm%#PKp922ym^8Il_g1qu;Y19nEML|c~ZX1Z&cK&NSUcfSr$^}O$V~H9^B+i z@RX{t3u-2&!SPUfg1r#ZXGWQD}^n7pn-Ft`m}1z)&nGtynU~wt@upI2B}; zWhf*WHmIvr6?6Qz9du$P&?-Wv>V(AR3&kgo^KH|?@mqmvmkdQA2#-40xngKuRJJNt ztzv9tqn&J-XY(;Otw@=ylhTni&`YptMTSzZ%&SA3rGa|~Sm(I9t9hFH=L+cqK8lwb zs|ZQe2?@y#+wj1u6&1?Z@~&Yhd%Y6g@Z^_nte?N0i!@mj3PUs=ct6KEb& z9$bMzB^U_Yp`qfgNCqzX%3ybn2vt$V(G5#-MFEi8+cfZZ`H(bL@Xh%l?cy=890Ic;X{pnK6*(U;Me(7&S3qkn|N-L>cq^nd78^h@+4*v2JjFi8<)H*UIc z(}|lUxaq)6J8s%=18HP}WO2jbrhuC~ZgRNErYJ-jH2#{wO&T{T+{q_{S9j*S_-^(! z0(~DnjV?w7bO@b|zJ~sYZbna_8`wFtnSBktjCP`>Xg?CsZnPSG8-#n1^>frRGAdhk z7a(h0Dd%+I{-~nZiTf+{y(J8_f}F3mb>yk#WV!a$jz>h5sJ4Yk(ZW1z^*l^@p3$gK zU8tHUzc5j*TBPg}YCTz7?(bpg!tI40Q ze0b~Y(p2@T2w70_^2w3Da?K{$My-M8;K$eH&*Zxc7ZHVHIARnof|#-mqQ_fkJ4BZE zqIKv>h$?FfZ?I3Yw->(1&K33}TpU>*#*~yF>m9c4(3E54FSDtlg))7U(7}(#J zr=t)U3xelD30eYSjDw>H*s?V2oRz0DZaFAgv4H4wXMadhaZLEsnfURWGn*a=u-_2TIA z;?j6=N8&7woh8r@(Yufj=XEhV3&Ov|VpN^l9;en@MqY8MvD2a61xB7cedda13WuOH z9UUe<$`@-7GqbQ>1|Md4=nd!+AzcFY&4;=jg>Yy-9Ga_&n{*gAGhy6Jm*XZTO`&I!=mo%PktDCc>RtgU zzKk}a9};Pb#%&^tUMI3SXp-YCR&!HXbj(I4Bu!B-)J(68yZ{CDJ_PcjQns2hoL+1PrufWKjgrbrdbDu*SjVC*bpr0sejw zJrlBC(`YC@1zgUiD_?>W;PhK;bTbJeGeSr4;{O*t1x9qVd|ShS`5WjRjU))KS+MZA zaN&y?ehaqu;b@3s;m>e1MBjr8C( z3rrL2Ec*n6i;H0c??66#8;h?h!%@hH=>&0=8y##(lcy`9|#SCBiw(jc+Ld9B`UGAriABf|2rE*?=fE7rvWL;1KD zj|j`hD&>`-e4KZ$nLpv;5n=gQZ#G9zKHkM6!t${$9ubz0b@3=e`PMJv!o?%P^06)+ z5tfg2@ra;&%ge-0{C`rSY*wt>M3l{Hahr%P6Nz_G1KHpw<2iVLf(1zTGI;NWcyj=< zLmxor157#-^`HX#Ci^mrA@IMmK8`8X|6Q!^xxMbWt?n7sJ+pPsOx<%B;9gqdrsCqcT7^X9g~URBx(fs?1v*D#SAeGL=2(bq7M8+~OLXqkntg@vzS1~;P3E%as=zS7ax z-S~Z{Fl`$Vrxz$v3ty89U#W$!35tT78{G3c*kJ;a+}}c9gf)H)eF$xa1ov{3WPi;b zXO93dx`Ex#4x^V~#Tx5(Qv!Li=5;jgZg1S(*0>ur?q;jI{RPuws{0qZ3yr(;jk|M= zyR(hE>2AN_@-vOe(~Y}Rjk}YLyQ!M)+`QH&u6pU!&Y729?Rv+pZ%k8H6u-Cky|(Z5y`C0Jql1l#k_}DuQ3^#FVpkxMEZRgg8ezF(|h4ZTxLJd#$pdUlHWP#QBrD z$-u!?rqBO{1j&9`>|I)85{u0CMUFAGsu!q1^*aIBdo1i&gkSVoLi-i^vi#5Ie zP12vXTdFp#tE$jys!9Uk;&6GsX!zhGp^q)So;qk#+HU$(6-6RixFlGP((_Fo!^fIl zx08IIW>3&8W-{%V0E<2WY)Q8wsBQvP&d<~#)s0e;ij`%N9D9hr-p6t}+!q)g0gs5s zipQqAFW7Iju>DrTZJKmI|5%fDhzVcxrS?+kT&XN9!$F7;h#=W2;E|a8gDym+-#{O0 zl?#Vt2D1e2!yTAKhY8@b^^R-=#|ezXKQN8p0Pyjc{sXn`r?NkbnR7|a+g%QP$r zd}dJfJ`MUrMyX9SzE;8bicE&PxCS=~UcgPbhhnZmwqdad0+Xn*^`;|Z?J4zK$|*$W z>Cg2_#nTl9VLnp~O*>3elt2`I#jd}PS=IuN#^BrML|~-@1jg`&ZW%4;2R_gVrSkOefZrU1MVbDZ1DR>O zOo*Lj)7pmj8hEN6Jo5>7T;nsD(q^WoXYl&t2y=E)IOz{(CzTp6%>Ap6p z=HYmpzQ77P4z6_JapTF-53XF$o?`oDmD_xtuwLu)^h!sg4qaX5`Fn3>-}zWfF2w%= zRA6lNb=(^1-wEcj^O|Gc%XBl(?ef079HTcM2$u!Rg2mw)f1s#L^9LJ) wjsCJ#MVh~~IHW~F#jh2GLM0#U)0?}zT@rKIFL7J9cQF!n+x1H)y=9^Q04v`!Pyhe` diff --git a/src/main/scala/org/uml2semantics/model/UMLClassDiagram.scala b/src/main/scala/org/uml2semantics/model/UMLClassDiagram.scala index 081d4fd..3f56fb3 100644 --- a/src/main/scala/org/uml2semantics/model/UMLClassDiagram.scala +++ b/src/main/scala/org/uml2semantics/model/UMLClassDiagram.scala @@ -554,12 +554,9 @@ case class UMLClass(classIdentity: UMLClassIdentity, case class UMLClassAttributeDefinition(definition: String = "") sealed trait UMLClassAttributeType - case class UMLXMLDataType(attributeType: SupportedDataType) extends UMLClassAttributeType - case class UMLClassIdentityType(attributeType: UMLClassIdentity) extends UMLClassAttributeType - - +case class UMLEnumerationIdentityType(attributeType: UMLEnumerationIdentity) extends UMLClassAttributeType case class CurieBasedUMLClassAttributeType(attributeType: Curie) extends UMLClassAttributeType //case class UndefinedUMLClassAttributeType() extends UMLClassAttributeType @@ -571,20 +568,25 @@ object UMLClassAttributeType: def apply(s: String): UMLClassAttributeType = logger.debug(s"s=$s ${Code.source}") - require(UMLClassIdentity.findClassNamedElement(s).nonEmpty || SupportedDataType.unapply(s).nonEmpty - || Curie.isCurieBasedOnConfiguredPrefix(s) || s.isEmpty, - s"""A class attribute must have a type that is either a class, that has been specified, + require(UMLClassIdentity.findClassNamedElement(s).nonEmpty || + UMLEnumerationIdentity.findEnumerationNamedElement(s).nonEmpty || + SupportedDataType.unapply(s).nonEmpty || + Curie.isCurieBasedOnConfiguredPrefix(s) || + s.isEmpty, + s"""A class attribute must have a type that is either a class or enumeration, that has been specified, or an XML data type or an curie based on a known prefix. Prefixes are specified using the -x option when running uml2semantics. - "$s" is not recognised as either a class or an XML data type.""") + "$s" is not recognised as either a class or an enumeration or an XML data type.""") UMLClassIdentity.findClassNamedElement(s) match case Some(classNamedElement) => UMLClassIdentityType(classNamedElement) - case None => SupportedDataType.unapply(s) match - case Some(x) => UMLXMLDataType(x) - case None => - val curieOption: Option[Curie] = Curie.unapply(s) - curieOption match - case Some(curie) => CurieBasedUMLClassAttributeType(curie) - case None => UndefinedUMLClassAttributeType + case None => UMLEnumerationIdentity.findEnumerationNamedElement(s) match + case Some(enumerationNamedElement) => UMLEnumerationIdentityType(enumerationNamedElement) + case None => SupportedDataType.unapply(s) match + case Some(x) => UMLXMLDataType(x) + case None => + val curieOption: Option[Curie] = Curie.unapply(s) + curieOption match + case Some(curie) => CurieBasedUMLClassAttributeType(curie) + case None => UndefinedUMLClassAttributeType def unapply(s: String): Option[UMLClassAttributeType] = logger.debug(s"s=$s ${Code.source}") diff --git a/src/main/scala/org/uml2semantics/owl/UML2OWLWriter.scala b/src/main/scala/org/uml2semantics/owl/UML2OWLWriter.scala index 53d2823..cf86123 100644 --- a/src/main/scala/org/uml2semantics/owl/UML2OWLWriter.scala +++ b/src/main/scala/org/uml2semantics/owl/UML2OWLWriter.scala @@ -87,6 +87,8 @@ class UML2OWLWriter(val umlClassDiagram: UMLClassDiagram): owlProperty = createOWLDataProperty(umlClassAttribute, errorMessages, domain, attributeType) case UMLClassIdentityType(attributeType) => owlProperty = createOWLObjectProperty(umlClassAttribute, errorMessages, domain, attributeType) + case UMLEnumerationIdentityType(attributeType) => + owlProperty = createOWLObjectProperty(umlClassAttribute, errorMessages, domain, attributeType) case CurieBasedUMLClassAttributeType(attributeType) => owlProperty = createOWLObjectPropertyBasedOnConfiguredPrefix(umlClassAttribute, errorMessages, domain, attributeType) case UndefinedUMLClassAttributeType => @@ -157,6 +159,56 @@ class UML2OWLWriter(val umlClassDiagram: UMLClassDiagram): case UMLMultiplicity(UMLInfiniteCardinality(_), UMLInfiniteCardinality(_)) => objectProperty + private def createOWLObjectProperty(umlClassAttribute: UMLClassAttribute, + errorMessages: mutable.Seq[String], + domain: OWLClass, + umlEnumerationIdentity: UMLEnumerationIdentity): OWLObjectProperty = + logger.debug(s"createOWLObjectProperty: umlClassAttribute=$umlClassAttribute, errorMessages = $errorMessages, " + + s"domain=$domain, umlEnumerationIdentity=$umlEnumerationIdentity ${Code.source}") + val objectProperty = dataFactory.getOWLObjectProperty(umlClassAttribute.attributeIdentity.attributeIRI.iri) + val domainChangeApplied = manager.addAxiom(ontology, dataFactory.getOWLObjectPropertyDomainAxiom(objectProperty, domain)) + if domainChangeApplied != SUCCESSFULLY then + errorMessages :+ s"Domain axiom for object property ${objectProperty.getIRI} could not be added for " + + s"${umlClassAttribute.attributeIdentity.attributeIRI.iri}" + val rangeChangeApplied = manager.addAxiom(ontology, dataFactory.getOWLObjectPropertyRangeAxiom(objectProperty, + dataFactory.getOWLClass(umlEnumerationIdentity.enumerationIRI.iri))) + if rangeChangeApplied != SUCCESSFULLY then + errorMessages :+ s"Range axiom for data property ${objectProperty.getIRI} could not be added for " + + s"${umlClassAttribute.attributeIdentity.attributeIRI.iri}" + umlClassAttribute.multiplicity match + case UMLMultiplicity(UMLNonNegativeCardinality(minCardinality), UMLNonNegativeCardinality(maxCardinality)) => + logger.trace(s"minCardinality=$minCardinality ${Code.source}") + val axiom = + if minCardinality == maxCardinality && minCardinality != 0 then + dataFactory.getOWLSubClassOfAxiom(domain, dataFactory.getOWLObjectExactCardinality(maxCardinality, objectProperty, + dataFactory.getOWLClass(umlEnumerationIdentity.enumerationIRI.iri))) + else if minCardinality > 0 then + dataFactory.getOWLSubClassOfAxiom(domain, + dataFactory.getOWLObjectIntersectionOf( + dataFactory.getOWLObjectMinCardinality(minCardinality, objectProperty, + dataFactory.getOWLClass(umlEnumerationIdentity.enumerationIRI.iri)), + dataFactory.getOWLObjectMaxCardinality(maxCardinality, objectProperty, + dataFactory.getOWLClass(umlEnumerationIdentity.enumerationIRI.iri)))) + else + dataFactory.getOWLSubClassOfAxiom(domain, dataFactory.getOWLObjectMaxCardinality(maxCardinality, objectProperty, + dataFactory.getOWLClass(umlEnumerationIdentity.enumerationIRI.iri))) + if manager.addAxiom(ontology, axiom) != SUCCESSFULLY then + errorMessages :+ s"Could not add subclass axiom representing cardinalities [$minCardinality, $maxCardinality] for " + + s"${umlClassAttribute.attributeIdentity.attributeLabel}" + case UMLMultiplicity(UMLNonNegativeCardinality(minCardinality), UMLInfiniteCardinality(_)) => + if minCardinality > 0 then + val axiom = dataFactory.getOWLSubClassOfAxiom(domain, + dataFactory.getOWLObjectMinCardinality(minCardinality, objectProperty, + dataFactory.getOWLClass(umlEnumerationIdentity.enumerationIRI.iri))) + if manager.addAxiom(ontology, axiom) != SUCCESSFULLY then + errorMessages :+ s"Could not add subclass axiom representing cardinalities for [$minCardinality, *]" + + s"${umlClassAttribute.attributeIdentity.attributeLabel}" + case UMLMultiplicity(UMLInfiniteCardinality(_), UMLNonNegativeCardinality(maxCardinality)) => + errorMessages :+ s"Multiplicity error found with multiplicity = [*, $maxCardinality] for attribute = " + + s"${umlClassAttribute.attributeIdentity.attributeLabel}." + case UMLMultiplicity(UMLInfiniteCardinality(_), UMLInfiniteCardinality(_)) => + objectProperty + private def createOWLObjectProperty(umlClassAttribute: UMLClassAttribute, errorMessages: mutable.Seq[String], domain: OWLClass): OWLObjectProperty = diff --git a/src/main/scala/org/uml2semantics/reader/TSVReader.scala b/src/main/scala/org/uml2semantics/reader/TSVReader.scala index d040b4e..dfc9227 100644 --- a/src/main/scala/org/uml2semantics/reader/TSVReader.scala +++ b/src/main/scala/org/uml2semantics/reader/TSVReader.scala @@ -79,8 +79,9 @@ def parseAttributes(maybeTsvFile: Option[File], ontologyPrefix: PrefixNamespace) logger.trace(s"m = $m") val classNamedElement = UMLClassIdentity.findClassNamedElement(m(ClassAttributesHeader.ClassName.toString)) + val enumerationNamedElement = UMLEnumerationIdentity.findEnumerationNamedElement(m(ClassAttributesHeader.ClassName.toString)) logger.trace(s"classNamedElement = $classNamedElement") - if classNamedElement.isDefined then + if classNamedElement.isDefined || enumerationNamedElement.isDefined then logger.trace(s"mClassOrPrimitiveType.toString = {${m(ClassOrPrimitiveType.toString)}}") val curieOption: Option[Curie] = if m(Curie.toString).contains(":") then Some(org.uml2semantics.model.Curie(m(Curie.toString))) @@ -191,14 +192,19 @@ def parseEnumerationValues(maybeTsvFile: Option[File], ontologyPrefix: PrefixNam end parseEnumerationValues def parseUMLClassDiagram(input: InputParameters): UMLClassDiagram = + var umlClasses = parseClasses(input.classesTsv, PrefixNamespace(input.ontologyPrefix)) + var umlEnumerations = parseEnumerations(input.enumerationsTsv, PrefixNamespace(input.ontologyPrefix)) + var umlAttributes = parseAttributes(input.attributesTsv, PrefixNamespace(input.ontologyPrefix)) + var umlEnumerationValues = parseEnumerationValues(input.enumerationValuesTsv, PrefixNamespace(input.ontologyPrefix)) + UMLClassDiagram( input.owlOntologyFile.get, OntologyIRI(input.ontologyIRI), PrefixNamespace(input.ontologyPrefix), - parseClasses(input.classesTsv, PrefixNamespace(input.ontologyPrefix)), - parseAttributes(input.attributesTsv, PrefixNamespace(input.ontologyPrefix)), - parseEnumerations(input.enumerationsTsv, PrefixNamespace(input.ontologyPrefix)), - parseEnumerationValues(input.enumerationValuesTsv, PrefixNamespace(input.ontologyPrefix))) + umlClasses, + umlAttributes, + umlEnumerations, + umlEnumerationValues) diff --git a/src/test/resources/Employer - Attributes.tsv b/src/test/resources/Employer - Attributes.tsv index 40c6166..5e71708 100644 --- a/src/test/resources/Employer - Attributes.tsv +++ b/src/test/resources/Employer - Attributes.tsv @@ -3,4 +3,7 @@ Person name xsd:string Person surname xsd:string Person dateOfBirth xsd:dateTime Employee employedBy Employer 1 1 -Employer employes Employee 1 * \ No newline at end of file +Employee renumeration Renumeration 1 1 +Employer employes Employee 1 * +Renumeration rate xsd:decimal 1 1 +Renumeration paymentSchedule PaymentSchedule 1 1 \ No newline at end of file diff --git a/src/test/resources/Employer - Classes.tsv b/src/test/resources/Employer - Classes.tsv index bc27587..ee08db7 100644 --- a/src/test/resources/Employer - Classes.tsv +++ b/src/test/resources/Employer - Classes.tsv @@ -1,4 +1,5 @@ Curie Name Definition ParentNames Person Employee Person - Employer Person \ No newline at end of file + Employer Person + Renumeration \ No newline at end of file diff --git a/src/test/resources/employer.rdf b/src/test/resources/employer.rdf index d566dd5..aa7665b 100644 --- a/src/test/resources/employer.rdf +++ b/src/test/resources/employer.rdf @@ -33,6 +33,17 @@ + + + + + + + renumeration + + + + @@ -44,6 +55,17 @@ + + + + + + + paymentSchedule + + + + + + + + + + rate + + + + + + + + + + + + 1 + + + + + + + 1 + + + + Renumeration + + + +