From bfb19d79e9b716809d4d869e6a325b0a7906379b Mon Sep 17 00:00:00 2001 From: Giancarlo Panichi Date: Tue, 21 Apr 2015 14:54:35 +0000 Subject: [PATCH] Updated Rules git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/tabular-data-expression-widget@114299 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../client/ColumnExpressionPanel.java | 2 +- .../expressionwidget/client/RuleDialog.java | 2 +- .../TemplateColumnExpressionDialog.java | 2 +- .../client/resources/ExpressionResources.java | 11 +- .../client/resources/rule-add.png | Bin 922 -> 1597 bytes .../client/resources/rule-column-add.png | Bin 0 -> 882 bytes .../client/resources/rule-column-add_32.png | Bin 0 -> 2031 bytes .../client/rpc/ExpressionService.java | 6 + .../client/rpc/ExpressionServiceAsync.java | 7 +- .../server/ExpressionServiceImpl.java | 169 ++++++++---------- .../service/rule/AppliedRulesResponseMap.java | 84 +++++++++ .../service/rule/RuleColumnTypeMap.java | 95 ++++++++++ .../service/rule/RuleDescriptionMap.java | 86 +++++++++ .../server/service/rule/RuleScopeMap.java | 46 +++++ .../client/resources/rule-add.png | Bin 922 -> 1597 bytes .../client/resources/rule-column-add.png | Bin 0 -> 882 bytes .../client/resources/rule-column-add_32.png | Bin 0 -> 2031 bytes 17 files changed, 406 insertions(+), 104 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add.png create mode 100644 src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add_32.png create mode 100644 src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/AppliedRulesResponseMap.java create mode 100644 src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleColumnTypeMap.java create mode 100644 src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleDescriptionMap.java create mode 100644 src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleScopeMap.java create mode 100644 src/main/resources/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add.png create mode 100644 src/main/resources/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add_32.png diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/ColumnExpressionPanel.java b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/ColumnExpressionPanel.java index a1cdd3c..b77cadc 100644 --- a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/ColumnExpressionPanel.java +++ b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/ColumnExpressionPanel.java @@ -250,7 +250,7 @@ public class ColumnExpressionPanel extends FramedPanel { conditionsField.add(conditionWidget); btnApply = new TextButton("Save"); - btnApply.setIcon(ExpressionResources.INSTANCE.rule()); + btnApply.setIcon(ExpressionResources.INSTANCE.ruleColumnAdd()); btnApply.setIconAlign(IconAlign.RIGHT); btnApply.setToolTip("Save rule"); btnApply.addSelectHandler(new SelectHandler() { diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/RuleDialog.java b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/RuleDialog.java index 9820860..d1574f2 100644 --- a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/RuleDialog.java +++ b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/RuleDialog.java @@ -69,7 +69,7 @@ public class RuleDialog extends Window implements setClosable(true); setModal(true); forceLayoutOnResize = true; - getHeader().setIcon(ExpressionResources.INSTANCE.rule()); + getHeader().setIcon(ExpressionResources.INSTANCE.ruleColumnAdd()); } diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/TemplateColumnExpressionDialog.java b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/TemplateColumnExpressionDialog.java index 2364604..4e4ee42 100644 --- a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/TemplateColumnExpressionDialog.java +++ b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/TemplateColumnExpressionDialog.java @@ -88,7 +88,7 @@ public class TemplateColumnExpressionDialog extends Window implements setClosable(true); setModal(true); forceLayoutOnResize = true; - getHeader().setIcon(ExpressionResources.INSTANCE.rule()); + getHeader().setIcon(ExpressionResources.INSTANCE.ruleAdd()); } diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/ExpressionResources.java b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/ExpressionResources.java index 65f54fb..e6ee3db 100644 --- a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/ExpressionResources.java +++ b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/ExpressionResources.java @@ -30,7 +30,16 @@ public interface ExpressionResources extends ClientBundle { ImageResource close(); @Source("rule-add.png") - ImageResource rule(); + ImageResource ruleAdd(); + + @Source("rule-add_32.png") + ImageResource ruleAdd32(); + + @Source("rule-column-add.png") + ImageResource ruleColumnAdd(); + + @Source("rule-column-add_32.png") + ImageResource ruleColumnAdd32(); @Source("wrench-go.png") ImageResource apply(); diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-add.png b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-add.png index 17bcae19515647f12f2fbc97be94be63b5967607..b3ee5c2d319c96effac875db3b13e01f6c74abbe 100644 GIT binary patch delta 1551 zcmV+q2Jrcs2fYj-iBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mz(e;tMg z{T2WK1-(f`K~zY`rIl}N-BlUKzt8!d`@8M^N815+bfwpIUAsv;s=UBus4r%TEYVFM zpu@yhU{ZC$SjR;{J5rL(Y%Mm?&=8F=(q%@%NJ#t>L`8U0=mzaNO#j|aH@TzT{eOSI z`#XOgUv!;+m^$>6oaDSYpXWSJf6nt9`pn7AcxBHl0N~CSIyVrU&%0EAkAUp7hMhpG z1<$Yky6Sslfv7G_es!5gMn_k(KhwcV2(?r5~Tc)Jv&UYG*Q;e}v;W%*>q6 z=V@YM0{@D+cYdS3!U@O$0`T2@&wGaNWbHMMbj)7Hk5@0=JuRvP&7*E%1& zy|t~CnVGD$B&9?qlfl&xy)Sg$7@_Fl-kZOWfFm$ldY4Kn$F6YUk_%r~ajrB=Ra4~M z-S>+Xv3z?aT4FHBS_>k=fB5(~=H}+|Qp(&1Ghq5;D&E=dIuXp2&VZN^=z#h@o`z+E z(RaRwd@aZ4%S*JSX&Y^C-+@>E{7Y(I*TDoL-}gC}%TXi}+0xh7mmMA+{)SSjNhyU; zC# zAo$eK(9j>PwNJ(4@rLH+W-Kf$Kss=GV(xXw`sXR)MDX=nzlEl{>p?_dW_)}5F?hO) zkv9kMe&s#1#M@C(9(?7Y-ibg;Ni8icc4=wp=R^c4CHM67KuXD(OopU202p9qFo3G6 zz;(iih2j8!sw$(Re=0E60L*{|*f99=8EY-KwY7<4GRdCjAr^~~5CTdmFte6{3f?aI z`EJ(lurOM`Hj_QOSPMK#B{~>jk|g;D6NC8S#M3DHIWRLN<2SQX zz#k@Gry+{CX+equ(iMpoapX20zG~uVe`;oabwcFXd?JK-|X&F;fQ)I0LfVG>0nJ;LqpDYv# zCk6)xE40=Sw|zg=2P>btW7DS_JCa){cV4Z7)9ExC8X7=d&op93@^OrQ=^(Zoe{SqZI-mUoBiHS^6&S;CY(1Ll zHuA0O?swJ2d+9Q(Ica?-zCPt z)>MR>f1AQ&EC4XdzD3bfaD-q-fIQz|`dk(HvN|@F?mB?~0`)&TCp7qRYk9D1W0W_n z3zIgM0iv>RQ1La01Un8WU($SPzC_G4@Uw#-J+$}mG{(}m{O14Wa@ z7sgr^LQt`yQK@MV5riNV%9>9vlt^nH7)y5@f5J5)tThj=~Sz`@8&sBh%OFhh&R85)lWqI+9@7!V3%>LF@=Y`HJFGvnA4&2acz^4(&ZM zjprY`<(dNs!@OAa&FZ8E03t-f0z^cGisIArB{G-g05J9;RgGHqC)1P2WC8RJl*y514qt$sIq*Z z4<3Bx-8y5rR~tOY%qe5>1`&;FrKe6jvCZQD;BP(hMCkl(kj4N2002ovPDHLkV1i*G B^Rxf} delta 871 zcmV-t1DO2144MZaiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZz1e=VTi z&AI>p0~$$0K~y-)jgH-KQ*|7NKi}W!&I?^_H@a7x$c8VlAzPOv>y6&YqCrhm2*{la zi4qc)S!R&T5pOU}1TTCc-e8PIRJfQ?10(VWsGHCkolxnvwp7X{r#(I0dHa36;YLCt zPx85Zo_q)ZlIJ?LD4L&b(K=sKf6&nH`N8UKYxSG_O8(TZPN8r*etN&Esz;@iosQ#_ zOw-&xK0baE07Ap(I#fe8em(N=uAMIXaHI`L#2Y)JM=k~D_mA5LF74Yk`mzx=pzAu% z&CQ8Ip+L9;jhyX$=IMuC{4NmSyp=;=b3f%PIn+Iiw>Ay(^iR`ba`;`=e-sUwOop=A z?3r*loH9+*6+*CBueI+Bh)}F8QQ0ohXx|vO>TRevCUWM2=--&Y((UVD$*5MVFbreN zb=`D49={TeMlTBm4a1Ia^-EEZFShK6`> zaFAWsB>+XSQe8b`AOhES@W-voyk!1`KUXreY+mC{&0FYd{wlYH+c}T{Nhxt>WLXwG z&wGcqzu(^45!sk|De+26$;zQzy8)Fn>TY@*KV~ilTa6**`Nww2f7#hz1OPBIm>ItB zA1V|I9}@r!oP2N~#KxyPw!F|A(ZfOp5)1h(FD^bp2NHW${?1*{t(tv!Vq)S$+=cS$ zN7MNJ;HlDcJ1=&w!-l6CX+1Q#30=kr1~xp2*}S*zdNulOdSXv1olawBX68SE&}QQa z9Q*?IeZWB{Pi x_kLFcmb=xEIOGRdHElnwskp$B{#OQoe*t~Bj2x`n2S@+_002ovPDHLkV1g&Klk@-p diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add.png b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add.png new file mode 100644 index 0000000000000000000000000000000000000000..15e8736f6aaff0f535386c23420e9f22912ecdaf GIT binary patch literal 882 zcmV-&1C9KNP)To#cIDmzv-F(K# zr7D;hUKCM7#Rw{dUK?x#w zJ<_IhJK`qq&n~yS;l(5qkz3nM%kN&A7zY6itVbMC2!TwJ!2mTQjuT#f?`KLA1Gyv> z!AuPTx9)6!8is*6a7N@}{`mbjO64+}>+AIAa#YSfi8-}22#Jaz;s8gx*#ZSca1Kn3 zD30l*T{_JMH*fw;sdNe>LPSw9lKwERJ6yI;u2nfa@FcAa7mAm-b$gX;rVn!(9A71ix3l}DcD#;-pxcY2<*+u__ZQ+&R-4$k3&UOHt%ln+Wb6m95Meyg?hb)5djc62MR$A9|Fnh#@5FZ+38nq zcb5B?J;Oxjntfkz!w*e0NvVA;%{y7YAI1D35KqX6Ze&oxw^_7)_(UF~rV!@EK zNTYF*Z})bXnSB(TBZ(ufT;0SuDC82O%4vv?nRk2ZSm1YUaT7=@uM zt&VppN+O~|dgS=mTC29QebByIT_+8Kh~a|})DQ`HF+`MB$Ge%y{6Dphw32%@|Hk*# z+GinHV{5qu+ygA4Wl0AwWUWBQ$mR{#J207*qo IM6N<$f(<&3R{#J2 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add_32.png b/src/main/java/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add_32.png new file mode 100644 index 0000000000000000000000000000000000000000..230cb1bff7d3c0335db8037d29c4823552b58c8a GIT binary patch literal 2031 zcmVE^-OnHx;xHHmYEDh;>0AKO@&M_=0ij=f*%wV3?!iD zi{B&@5FwxmA_2vSs6@jAi9rHtFcC>yV#1hNvP`Bklb+tv`}EZM-n-}c;k|lQJu`uP zQ7kB`-nsYP^S|f(&j$YwpTj5gf3EY;;S&IuuHct{UBAVOKC7Zt5k)lqswyIiDp(Oz z*(R5CU9qAlz2|rxM3eVo`I?~j{NStmUk32H0Ibz#Ri)Yr6ct72DNwoe;Wk;5elQox zNS*~mgsksWt;p|y9oqn?YPA(8_un~8CsIhfqQw6--Pe_q$TgMq)_bz_8OUc`9(>|W zvc5CY-Jb#wiIH|9B?uK92UP_%+mxkXE>Ny0uIm$qK?+dSBw!RY-m3~$g^K}bY%UaV z999?4V2qQ{L@~rb3_WY~lgM!lFTD672M-=3ilTH)0Tsb7jibcMJ#{_+fb{GZMHb^E zD!W%U-5-OR?pplo7=!QmY@XZV*wLdHW4f+o-`>59l*Tdi_;V2e?Gh-tXBdWk7D&C0 zNpzY%Q>X#Qabn{EK@boGu`7JvPqrzlCXJvEjJ{aZ_aczu=4>pEM zrNYwE5&)%A2`4dP?2Zd9@DT8De5+8~thV2$9(0&*zK7@dgY#-S910b(Tv zYao}+;`ts5bUFbOlM^g1E~2VTO-<4X!qk=BP)z~op~o=~Kfq=*!zq1=M_yef@0M`X zrQWGiKYyO9vLEHvkvnk2V_{()*Yn8uKB~&ObLZGOI!dKdNw^bWMX1$kv|26HDxryY$iTn=?XZJH7L2Cv^ydxllTS{K4SSb8wtw_;Trb0WjTx+j zhzLd@?-n>PaU&c$vle9HYe= zK@f2I^cf0MH_;rbu~A>ct&MQHA>_-WxUQdO!pOqa5`p8Q!Zr&yIX8djSboA=ZZF{( zj{$Fx$LSc9?=!q#ZN}wM{Ws;LVleh)8m{fH8D7=UIRI&zRL?bmsm=r@l!T zhD1?_QHvq!vw&iyFB5uXcDb%cvs34~ksG;d*XPN*c|6DCOZ)C)qrJ+{Uw@2t)MOwx z$YOm7RmF8(cJJQJyEFg9T48K-lq;^dg4x+wK6PLR<>4v-PrbB+)N zCFV#gth3yhXJ=uYqE}+0y~1kqeXLkq$B%t0q#USLs}zexthHn^nS@|UB$w_l;##0_ z2zOo33Yu@V!xjTxi8t3?=ZT|_^3KK^gc|bOw|>E|kN=ov=R8@jz}nUtWd*sO27cx>*-3xj^;Gvk#>R+|eP zS^PVyf@@p`v%?H!cJjC5ukeYC%(0|x$FCD51gF6<@DOQl7%)P(*Iw#+MhUb@#P%1b$jzgyv zqEUhU<*z{JCjNA6i%MsO;i&_>)to>Z($^CRuo{=#q-q)<<2ecQdu4xHHM}GD7hYoz z9u+S4zD#*Apthq8D)??5WC&}sbVA|nv&y=BoZ*2gDpBupW_yJ+=HiN}+9RRu2k^*! zdwB5inZb73vU4cM-l-}X&qWmKt%ycwF@WzHN(GNXF3aa`*ug--|4{AsQ!g#yIwnPN zp#_|8|MXR_Bavc5|w@W!b+D_czp`3Nu=<0J=xh|?R@Fo+cdgGiiY(ot>O zXs3v466N~Y6hLV0kKS8p9ke3*Yt;;)g;VoQ7B_-Fo callback); + + void getAppliedRulesByTabularResourceId(TRId trId, + AsyncCallback callback); } diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/ExpressionServiceImpl.java b/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/ExpressionServiceImpl.java index 7779966..4dd741e 100644 --- a/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/ExpressionServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/ExpressionServiceImpl.java @@ -19,14 +19,17 @@ import org.gcube.data.analysis.tabulardata.service.impl.TabularDataServiceFactor import org.gcube.data.analysis.tabulardata.service.rules.RuleId; import org.gcube.data.analysis.tabulardata.service.tabular.TabularResourceId; import org.gcube.portlets.user.td.expressionwidget.client.rpc.ExpressionService; +import org.gcube.portlets.user.td.expressionwidget.server.service.rule.AppliedRulesResponseMap; +import org.gcube.portlets.user.td.expressionwidget.server.service.rule.RuleColumnTypeMap; +import org.gcube.portlets.user.td.expressionwidget.server.service.rule.RuleDescriptionMap; +import org.gcube.portlets.user.td.expressionwidget.server.service.rule.RuleScopeMap; import org.gcube.portlets.user.td.expressionwidget.shared.exception.ExpressionParserException; import org.gcube.portlets.user.td.expressionwidget.shared.exception.ExpressionServiceException; import org.gcube.portlets.user.td.gwtservice.server.SessionUtil; import org.gcube.portlets.user.td.gwtservice.server.TDGWTServiceImpl; import org.gcube.portlets.user.td.gwtservice.server.trservice.ColumnDataTypeMap; -import org.gcube.portlets.user.td.gwtservice.server.trservice.rule.RuleColumnTypeMap; -import org.gcube.portlets.user.td.gwtservice.server.trservice.rule.RuleScopeMap; import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTServiceException; +import org.gcube.portlets.user.td.gwtservice.shared.rule.AppliedRulesResponseData; import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleScopeType; import org.gcube.portlets.user.td.gwtservice.shared.rule.ApplyColumnRulesSession; @@ -272,8 +275,7 @@ public class ExpressionServiceImpl extends TDGWTServiceImpl implements } } - - + /** * * {@inheritDoc} @@ -308,7 +310,7 @@ public class ExpressionServiceImpl extends TDGWTServiceImpl implements ruleDescription.getOwner(), RuleScopeMap.map(ruleDescription.getScope()), tdRuleColumnType, cexp); - logger.info("Rule: "+ruleData); + logger.info("Rule: " + ruleData); rulesDes.add(ruleData); } @@ -335,7 +337,7 @@ public class ExpressionServiceImpl extends TDGWTServiceImpl implements * * {@inheritDoc} */ - @Override + @Override public ArrayList getApplicableBaseColumnRules( ColumnData columnData) throws TDGWTServiceException { try { @@ -361,29 +363,20 @@ public class ExpressionServiceImpl extends TDGWTServiceImpl implements List rules = service .getApplicableBaseColumnRules(dataType); - if(rules==null){ + if (rules == null) { logger.error("Invalid applicable base column rules from service: null"); - throw new TDGWTServiceException("Error retrieving the rules: invalid applicable base column rules from service(null)"); + throw new TDGWTServiceException( + "Error retrieving the rules: invalid applicable base column rules from service(null)"); } else { - logger.debug("Applicable Base Column Rules: "+rules.size()); + logger.debug("Applicable Base Column Rules: " + rules.size()); } ArrayList rulesDes = new ArrayList(); - C_ExpressionParser parser = new C_ExpressionParser(); - for (RuleDescription ruleDescription : rules) { - Expression serviceExpression = ruleDescription.getRule(); - C_Expression cexp = parser.parse(serviceExpression); - TDRuleColumnType tdRuleColumnType = RuleColumnTypeMap - .map(ruleDescription.getRuleColumnType()); - RuleDescriptionData ruleData = new RuleDescriptionData( - ruleDescription.getId(), ruleDescription.getName(), - ruleDescription.getDescription(), - ruleDescription.getOwner(), - RuleScopeMap.map(ruleDescription.getScope()), - tdRuleColumnType, cexp); + RuleDescriptionData ruleData = RuleDescriptionMap + .map(ruleDescription); rulesDes.add(ruleData); - logger.info("Rule:"+ruleData); + logger.info("Rule:" + ruleData); } @@ -397,91 +390,71 @@ public class ExpressionServiceImpl extends TDGWTServiceImpl implements e.printStackTrace(); throw e; } catch (Throwable e) { - logger.error("Error in getApplicableBaseColumnRules(): " + e.getLocalizedMessage()); + logger.error("Error in getApplicableBaseColumnRules(): " + + e.getLocalizedMessage()); e.printStackTrace(); throw new TDGWTServiceException("Error retrieving the rules: " + e.getLocalizedMessage()); } } - - - public ArrayList getAppliedRulesByTabularResourceId( - TRId trId) throws TDGWTServiceException { - try { - HttpSession session = this.getThreadLocalRequest().getSession(); - ASLSession aslSession = SessionUtil.getAslSession(session); + + /** + * + * {@inheritDoc} + */ + @Override + public AppliedRulesResponseData getAppliedRulesByTabularResourceId(TRId trId) + throws TDGWTServiceException { + try { + HttpSession session = this.getThreadLocalRequest().getSession(); + ASLSession aslSession = SessionUtil.getAslSession(session); - logger.debug("GetAppliedRulesByTabularResourceId(): " + trId); - AuthorizationProvider.instance.set(new AuthorizationToken( - aslSession.getUsername(), aslSession.getScope())); - TabularDataService service = TabularDataServiceFactory.getService(); + logger.debug("GetAppliedRulesByTabularResourceId(): " + trId); + AuthorizationProvider.instance.set(new AuthorizationToken( + aslSession.getUsername(), aslSession.getScope())); + TabularDataService service = TabularDataServiceFactory.getService(); - if (trId == null || trId.getId()==null || trId.getId().isEmpty()) { - logger.error("Error in getAppliedRulesByTabularResourceId(): No valid tabular resource id!"); - throw new TDGWTServiceException( - "Error in get applied rules: invalid tabular resource id!"); - } + if (trId == null || trId.getId() == null || trId.getId().isEmpty()) { + logger.error("Error in getAppliedRulesByTabularResourceId(): No valid tabular resource id!"); + throw new TDGWTServiceException( + "Error in get applied rules: invalid tabular resource id!"); + } - TabularResourceId tabularResourceId=new TabularResourceId(Long.valueOf(trId.getId())); - - AppliedRulesResponse appliedRulesResponse = service - .getAppliedRulesByTabularResourceId(tabularResourceId); - if(appliedRulesResponse==null){ - logger.error("Invalid applied rules response from service: null"); - throw new TDGWTServiceException("Invalid applied rules response from service: null"); - } else { - logger.debug("Applied Rules Response: "+appliedRulesResponse); - } - - //List appliedRulesResponse.getTableRules(); - - - - /* - - ArrayList rulesDes = new ArrayList(); + TabularResourceId tabularResourceId = new TabularResourceId( + Long.valueOf(trId.getId())); - C_ExpressionParser parser = new C_ExpressionParser(); + AppliedRulesResponse appliedRulesResponse = service + .getAppliedRulesByTabularResourceId(tabularResourceId); + if (appliedRulesResponse == null) { + logger.error("Invalid applied rules response from service: null"); + throw new TDGWTServiceException( + "Invalid applied rules response from service: null"); + } else { + logger.debug("Applied Rules Response: " + appliedRulesResponse); + } - for (RuleDescription ruleDescription : rules) { - Expression serviceExpression = ruleDescription.getRule(); - C_Expression cexp = parser.parse(serviceExpression); - TDRuleColumnType tdRuleColumnType = RuleColumnTypeMap - .map(ruleDescription.getRuleColumnType()); - RuleDescriptionData ruleData = new RuleDescriptionData( - ruleDescription.getId(), ruleDescription.getName(), - ruleDescription.getDescription(), - ruleDescription.getOwner(), - RuleScopeMap.map(ruleDescription.getScope()), - tdRuleColumnType, cexp); - rulesDes.add(ruleData); - logger.info("Rule:"+ruleData); + AppliedRulesResponseData appliedRulesResponseData = AppliedRulesResponseMap + .map(appliedRulesResponse); - } - - return rulesDes; - */ - - return null; - } catch (TDGWTServiceException e) { - logger.error(e.getLocalizedMessage()); - throw e; - } catch (SecurityException e) { - logger.error(e.getLocalizedMessage()); - e.printStackTrace(); - throw e; - } catch (Throwable e) { - logger.error("Error in getApplicableBaseColumnRules(): " + e.getLocalizedMessage()); - e.printStackTrace(); - throw new TDGWTServiceException("Error retrieving the rules: " - + e.getLocalizedMessage()); - } + return appliedRulesResponseData; + } catch (TDGWTServiceException e) { + logger.error(e.getLocalizedMessage()); + throw e; + } catch (SecurityException e) { + logger.error(e.getLocalizedMessage()); + e.printStackTrace(); + throw e; + } catch (Throwable e) { + logger.error("Error in getAppliedRulesByTabularResourceId(): " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw new TDGWTServiceException("Error retrieving applied rules: " + + e.getLocalizedMessage()); + } - } - - + } /** * @@ -514,11 +487,12 @@ public class ExpressionServiceImpl extends TDGWTServiceImpl implements RuleColumnType ruleColumnType = RuleColumnTypeMap .map(ruleDescriptionData.getTdRuleColumnType()); - if(ruleColumnType==null){ + if (ruleColumnType == null) { logger.debug("Error saving rule: rule column type is null!"); - throw new TDGWTServiceException("Error saving rule: rule column type is null!"); + throw new TDGWTServiceException( + "Error saving rule: rule column type is null!"); } - + RuleId ruleId = service.saveColumnRule( ruleDescriptionData.getName(), ruleDescriptionData.getDescription(), conditionExpression, @@ -592,9 +566,6 @@ public class ExpressionServiceImpl extends TDGWTServiceImpl implements } } - - - /** * diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/AppliedRulesResponseMap.java b/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/AppliedRulesResponseMap.java new file mode 100644 index 0000000..669c4a0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/AppliedRulesResponseMap.java @@ -0,0 +1,84 @@ +package org.gcube.portlets.user.td.expressionwidget.server.service.rule; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.data.analysis.tabulardata.commons.webservice.types.AppliedRulesResponse; +import org.gcube.data.analysis.tabulardata.commons.webservice.types.RuleDescription; +import org.gcube.portlets.user.td.expressionwidget.shared.exception.ExpressionParserException; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTServiceException; +import org.gcube.portlets.user.td.gwtservice.shared.rule.AppliedRulesResponseData; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class AppliedRulesResponseMap { + private static Logger logger = LoggerFactory + .getLogger(AppliedRulesResponseMap.class); + + public static AppliedRulesResponseData map( + AppliedRulesResponse appliedRulesResponse) + throws TDGWTServiceException, ExpressionParserException { + AppliedRulesResponseData appliedRulesResponseData = null; + if (appliedRulesResponse == null) { + logger.debug("Applied Rules: " + appliedRulesResponse); + throw new TDGWTServiceException("Applied Rules Response is null!"); + } + + ArrayList tableRulesData = new ArrayList(); + List tableRules = appliedRulesResponse.getTableRules(); + if (tableRules != null && tableRules.size() > 0) { + for (RuleDescription ruleDescription : tableRules) { + RuleDescriptionData ruleDescriptionData = RuleDescriptionMap + .map(ruleDescription); + if (ruleDescriptionData != null) { + tableRulesData.add(ruleDescriptionData); + } else { + logger.error("Invalid Rule Description(Rule is discarded): " + + ruleDescription); + + } + + } + } + + HashMap> columnRuleMappingData = new HashMap>(); + Map> columnRuleMapping = appliedRulesResponse + .getColumnRuleMapping(); + if (columnRuleMapping != null && columnRuleMapping.size() > 0) { + for (Map.Entry> entry : columnRuleMapping + .entrySet()) { + ArrayList columnRules = new ArrayList(); + for (RuleDescription ruleDescription : entry.getValue()) { + RuleDescriptionData ruleDescriptionData = RuleDescriptionMap + .map(ruleDescription); + if (ruleDescriptionData != null) { + columnRules.add(ruleDescriptionData); + } else { + logger.error("Invalid Rule Description(Rule is discarded): " + + ruleDescription); + + } + } + columnRuleMappingData.put(entry.getKey(), columnRules); + + } + } + + appliedRulesResponseData = new AppliedRulesResponseData(tableRulesData, + columnRuleMappingData); + + logger.debug("Applied Rules: " + appliedRulesResponseData); + return appliedRulesResponseData; + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleColumnTypeMap.java b/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleColumnTypeMap.java new file mode 100644 index 0000000..6f529bd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleColumnTypeMap.java @@ -0,0 +1,95 @@ +package org.gcube.portlets.user.td.expressionwidget.server.service.rule; + +import org.gcube.data.analysis.tabulardata.commons.rules.types.BaseColumnRuleType; +import org.gcube.data.analysis.tabulardata.commons.rules.types.DimensionColumnRuleType; +import org.gcube.data.analysis.tabulardata.commons.rules.types.RuleColumnType; +import org.gcube.data.analysis.tabulardata.commons.utils.DimensionReference; +import org.gcube.data.analysis.tabulardata.model.column.ColumnLocalId; +import org.gcube.data.analysis.tabulardata.model.table.TableId; +import org.gcube.portlets.user.td.gwtservice.server.trservice.ColumnDataTypeMap; +import org.gcube.portlets.user.td.gwtservice.shared.rule.type.TDBaseColumnRuleType; +import org.gcube.portlets.user.td.gwtservice.shared.rule.type.TDDimensionColumnRuleType; +import org.gcube.portlets.user.td.gwtservice.shared.rule.type.TDRuleColumnType; +import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.column.DimensionReferenceData; + +/** + * + * @author giancarlo + * email: g.panichi@isti.cnr.it + * + */ +public class RuleColumnTypeMap { + + public static RuleColumnType map(TDRuleColumnType tdRuleColumnType) { + if (tdRuleColumnType == null) { + return null; + } + + if (tdRuleColumnType instanceof TDBaseColumnRuleType) { + TDBaseColumnRuleType tdBaseColumnRuleType = (TDBaseColumnRuleType) tdRuleColumnType; + BaseColumnRuleType baseColumnRuleType = new BaseColumnRuleType( + ColumnDataTypeMap.map(tdBaseColumnRuleType + .getColumnDataType())); + return baseColumnRuleType; + + } + + if (tdRuleColumnType instanceof TDDimensionColumnRuleType) { + TDDimensionColumnRuleType tdDimensionColumnRuleType = (TDDimensionColumnRuleType) tdRuleColumnType; + + TableId tableId = new TableId( + Long.valueOf(tdDimensionColumnRuleType + .getDimensionReferenceData().getTableId())); + ColumnLocalId columnId = new ColumnLocalId( + tdDimensionColumnRuleType.getDimensionReferenceData() + .getColumnId()); + + DimensionReference dimensionReference = new DimensionReference( + tableId, columnId); + + DimensionColumnRuleType dimensionColumnRuleType = new DimensionColumnRuleType( + dimensionReference); + + return dimensionColumnRuleType; + + } + + return null; + + } + + public static TDRuleColumnType map(RuleColumnType ruleColumnType) { + if (ruleColumnType == null) { + return null; + } + + if (ruleColumnType instanceof BaseColumnRuleType) { + BaseColumnRuleType baseColumnRuleType = (BaseColumnRuleType) ruleColumnType; + TDBaseColumnRuleType tdBaseColumnRuleType = new TDBaseColumnRuleType( + ColumnDataTypeMap.map(baseColumnRuleType + .getInternalType())); + return tdBaseColumnRuleType; + + } + + if (ruleColumnType instanceof DimensionColumnRuleType) { + DimensionColumnRuleType dimensionColumnRuleType = (DimensionColumnRuleType) ruleColumnType; + + DimensionReference dimensionReference=(DimensionReference)dimensionColumnRuleType.getInternalType(); + + DimensionReferenceData dimensionReferenceData = new DimensionReferenceData( + String.valueOf(dimensionReference.getTableId().getValue()), dimensionReference.getColumnId().getValue()); + + TDDimensionColumnRuleType tdDimensionColumnRuleType = new TDDimensionColumnRuleType( + dimensionReferenceData); + + return tdDimensionColumnRuleType; + + } + + return null; + + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleDescriptionMap.java b/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleDescriptionMap.java new file mode 100644 index 0000000..4b4a715 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleDescriptionMap.java @@ -0,0 +1,86 @@ +package org.gcube.portlets.user.td.expressionwidget.server.service.rule; + + + +import org.gcube.data.analysis.tabulardata.commons.webservice.types.RuleDescription; +import org.gcube.data.analysis.tabulardata.expression.Expression; +import org.gcube.portlets.user.td.expressionwidget.server.C_ExpressionParser; +import org.gcube.portlets.user.td.expressionwidget.shared.exception.ExpressionParserException; +import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTServiceException; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleDescriptionData; +import org.gcube.portlets.user.td.gwtservice.shared.rule.type.TDRuleColumnType; +import org.gcube.portlets.user.td.widgetcommonevent.shared.expression.C_Expression; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public class RuleDescriptionMap { + private static Logger logger = LoggerFactory + .getLogger(RuleDescriptionMap.class); + + + public static RuleDescriptionData map(RuleDescription ruleDescription) + throws TDGWTServiceException, ExpressionParserException { + RuleDescriptionData ruleDescriptionData=null; + if(ruleDescription==null){ + logger.error("Rule description is null"); + throw new TDGWTServiceException("Rule description is null"); + + } + + + if(ruleDescription.getScope()==null){ + logger.error("Rule description has scope null"); + throw new TDGWTServiceException("Rule description has scope null"); + } + + + switch (ruleDescription.getScope()) { + case COLUMN: + ruleDescriptionData=createColumnRule(ruleDescription); + break; + case TABLE: + ruleDescriptionData=createTableRule(ruleDescription); + break; + default: + break; + } + + return ruleDescriptionData; + + } + + + private static RuleDescriptionData createTableRule( + RuleDescription ruleDescription) { + return null; + } + + + private static RuleDescriptionData createColumnRule( + RuleDescription ruleDescription) throws ExpressionParserException { + + Expression serviceExpression = ruleDescription.getRule(); + + C_ExpressionParser parser = new C_ExpressionParser(); + + C_Expression cexp = parser.parse(serviceExpression); + TDRuleColumnType tdRuleColumnType = RuleColumnTypeMap + .map(ruleDescription.getRuleColumnType()); + RuleDescriptionData ruleData = new RuleDescriptionData( + ruleDescription.getId(), ruleDescription.getName(), + ruleDescription.getDescription(), + ruleDescription.getOwner(), + RuleScopeMap.map(ruleDescription.getScope()), + tdRuleColumnType, cexp); + + return ruleData; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleScopeMap.java b/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleScopeMap.java new file mode 100644 index 0000000..e497bf1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/td/expressionwidget/server/service/rule/RuleScopeMap.java @@ -0,0 +1,46 @@ +package org.gcube.portlets.user.td.expressionwidget.server.service.rule; + +import org.gcube.data.analysis.tabulardata.commons.rules.RuleScope; +import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleScopeType; + + +/** + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public class RuleScopeMap { + public static RuleScopeType map(RuleScope ruleScope) { + if(ruleScope==null){ + return null; + } + + switch (ruleScope) { + case COLUMN: + return RuleScopeType.COLUMN; + case TABLE: + return RuleScopeType.TABLE; + default: + return null; + + } + } + + public static RuleScope map(RuleScopeType ruleScopeType) { + if(ruleScopeType==null){ + return null; + } + + switch (ruleScopeType) { + case COLUMN: + return RuleScope.COLUMN; + case TABLE: + return RuleScope.TABLE; + default: + return null; + + } + } + +} diff --git a/src/main/resources/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-add.png b/src/main/resources/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-add.png index 17bcae19515647f12f2fbc97be94be63b5967607..b3ee5c2d319c96effac875db3b13e01f6c74abbe 100644 GIT binary patch delta 1551 zcmV+q2Jrcs2fYj-iBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mz(e;tMg z{T2WK1-(f`K~zY`rIl}N-BlUKzt8!d`@8M^N815+bfwpIUAsv;s=UBus4r%TEYVFM zpu@yhU{ZC$SjR;{J5rL(Y%Mm?&=8F=(q%@%NJ#t>L`8U0=mzaNO#j|aH@TzT{eOSI z`#XOgUv!;+m^$>6oaDSYpXWSJf6nt9`pn7AcxBHl0N~CSIyVrU&%0EAkAUp7hMhpG z1<$Yky6Sslfv7G_es!5gMn_k(KhwcV2(?r5~Tc)Jv&UYG*Q;e}v;W%*>q6 z=V@YM0{@D+cYdS3!U@O$0`T2@&wGaNWbHMMbj)7Hk5@0=JuRvP&7*E%1& zy|t~CnVGD$B&9?qlfl&xy)Sg$7@_Fl-kZOWfFm$ldY4Kn$F6YUk_%r~ajrB=Ra4~M z-S>+Xv3z?aT4FHBS_>k=fB5(~=H}+|Qp(&1Ghq5;D&E=dIuXp2&VZN^=z#h@o`z+E z(RaRwd@aZ4%S*JSX&Y^C-+@>E{7Y(I*TDoL-}gC}%TXi}+0xh7mmMA+{)SSjNhyU; zC# zAo$eK(9j>PwNJ(4@rLH+W-Kf$Kss=GV(xXw`sXR)MDX=nzlEl{>p?_dW_)}5F?hO) zkv9kMe&s#1#M@C(9(?7Y-ibg;Ni8icc4=wp=R^c4CHM67KuXD(OopU202p9qFo3G6 zz;(iih2j8!sw$(Re=0E60L*{|*f99=8EY-KwY7<4GRdCjAr^~~5CTdmFte6{3f?aI z`EJ(lurOM`Hj_QOSPMK#B{~>jk|g;D6NC8S#M3DHIWRLN<2SQX zz#k@Gry+{CX+equ(iMpoapX20zG~uVe`;oabwcFXd?JK-|X&F;fQ)I0LfVG>0nJ;LqpDYv# zCk6)xE40=Sw|zg=2P>btW7DS_JCa){cV4Z7)9ExC8X7=d&op93@^OrQ=^(Zoe{SqZI-mUoBiHS^6&S;CY(1Ll zHuA0O?swJ2d+9Q(Ica?-zCPt z)>MR>f1AQ&EC4XdzD3bfaD-q-fIQz|`dk(HvN|@F?mB?~0`)&TCp7qRYk9D1W0W_n z3zIgM0iv>RQ1La01Un8WU($SPzC_G4@Uw#-J+$}mG{(}m{O14Wa@ z7sgr^LQt`yQK@MV5riNV%9>9vlt^nH7)y5@f5J5)tThj=~Sz`@8&sBh%OFhh&R85)lWqI+9@7!V3%>LF@=Y`HJFGvnA4&2acz^4(&ZM zjprY`<(dNs!@OAa&FZ8E03t-f0z^cGisIArB{G-g05J9;RgGHqC)1P2WC8RJl*y514qt$sIq*Z z4<3Bx-8y5rR~tOY%qe5>1`&;FrKe6jvCZQD;BP(hMCkl(kj4N2002ovPDHLkV1i*G B^Rxf} delta 871 zcmV-t1DO2144MZaiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZz1e=VTi z&AI>p0~$$0K~y-)jgH-KQ*|7NKi}W!&I?^_H@a7x$c8VlAzPOv>y6&YqCrhm2*{la zi4qc)S!R&T5pOU}1TTCc-e8PIRJfQ?10(VWsGHCkolxnvwp7X{r#(I0dHa36;YLCt zPx85Zo_q)ZlIJ?LD4L&b(K=sKf6&nH`N8UKYxSG_O8(TZPN8r*etN&Esz;@iosQ#_ zOw-&xK0baE07Ap(I#fe8em(N=uAMIXaHI`L#2Y)JM=k~D_mA5LF74Yk`mzx=pzAu% z&CQ8Ip+L9;jhyX$=IMuC{4NmSyp=;=b3f%PIn+Iiw>Ay(^iR`ba`;`=e-sUwOop=A z?3r*loH9+*6+*CBueI+Bh)}F8QQ0ohXx|vO>TRevCUWM2=--&Y((UVD$*5MVFbreN zb=`D49={TeMlTBm4a1Ia^-EEZFShK6`> zaFAWsB>+XSQe8b`AOhES@W-voyk!1`KUXreY+mC{&0FYd{wlYH+c}T{Nhxt>WLXwG z&wGcqzu(^45!sk|De+26$;zQzy8)Fn>TY@*KV~ilTa6**`Nww2f7#hz1OPBIm>ItB zA1V|I9}@r!oP2N~#KxyPw!F|A(ZfOp5)1h(FD^bp2NHW${?1*{t(tv!Vq)S$+=cS$ zN7MNJ;HlDcJ1=&w!-l6CX+1Q#30=kr1~xp2*}S*zdNulOdSXv1olawBX68SE&}QQa z9Q*?IeZWB{Pi x_kLFcmb=xEIOGRdHElnwskp$B{#OQoe*t~Bj2x`n2S@+_002ovPDHLkV1g&Klk@-p diff --git a/src/main/resources/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add.png b/src/main/resources/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add.png new file mode 100644 index 0000000000000000000000000000000000000000..15e8736f6aaff0f535386c23420e9f22912ecdaf GIT binary patch literal 882 zcmV-&1C9KNP)To#cIDmzv-F(K# zr7D;hUKCM7#Rw{dUK?x#w zJ<_IhJK`qq&n~yS;l(5qkz3nM%kN&A7zY6itVbMC2!TwJ!2mTQjuT#f?`KLA1Gyv> z!AuPTx9)6!8is*6a7N@}{`mbjO64+}>+AIAa#YSfi8-}22#Jaz;s8gx*#ZSca1Kn3 zD30l*T{_JMH*fw;sdNe>LPSw9lKwERJ6yI;u2nfa@FcAa7mAm-b$gX;rVn!(9A71ix3l}DcD#;-pxcY2<*+u__ZQ+&R-4$k3&UOHt%ln+Wb6m95Meyg?hb)5djc62MR$A9|Fnh#@5FZ+38nq zcb5B?J;Oxjntfkz!w*e0NvVA;%{y7YAI1D35KqX6Ze&oxw^_7)_(UF~rV!@EK zNTYF*Z})bXnSB(TBZ(ufT;0SuDC82O%4vv?nRk2ZSm1YUaT7=@uM zt&VppN+O~|dgS=mTC29QebByIT_+8Kh~a|})DQ`HF+`MB$Ge%y{6Dphw32%@|Hk*# z+GinHV{5qu+ygA4Wl0AwWUWBQ$mR{#J207*qo IM6N<$f(<&3R{#J2 literal 0 HcmV?d00001 diff --git a/src/main/resources/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add_32.png b/src/main/resources/org/gcube/portlets/user/td/expressionwidget/client/resources/rule-column-add_32.png new file mode 100644 index 0000000000000000000000000000000000000000..230cb1bff7d3c0335db8037d29c4823552b58c8a GIT binary patch literal 2031 zcmVE^-OnHx;xHHmYEDh;>0AKO@&M_=0ij=f*%wV3?!iD zi{B&@5FwxmA_2vSs6@jAi9rHtFcC>yV#1hNvP`Bklb+tv`}EZM-n-}c;k|lQJu`uP zQ7kB`-nsYP^S|f(&j$YwpTj5gf3EY;;S&IuuHct{UBAVOKC7Zt5k)lqswyIiDp(Oz z*(R5CU9qAlz2|rxM3eVo`I?~j{NStmUk32H0Ibz#Ri)Yr6ct72DNwoe;Wk;5elQox zNS*~mgsksWt;p|y9oqn?YPA(8_un~8CsIhfqQw6--Pe_q$TgMq)_bz_8OUc`9(>|W zvc5CY-Jb#wiIH|9B?uK92UP_%+mxkXE>Ny0uIm$qK?+dSBw!RY-m3~$g^K}bY%UaV z999?4V2qQ{L@~rb3_WY~lgM!lFTD672M-=3ilTH)0Tsb7jibcMJ#{_+fb{GZMHb^E zD!W%U-5-OR?pplo7=!QmY@XZV*wLdHW4f+o-`>59l*Tdi_;V2e?Gh-tXBdWk7D&C0 zNpzY%Q>X#Qabn{EK@boGu`7JvPqrzlCXJvEjJ{aZ_aczu=4>pEM zrNYwE5&)%A2`4dP?2Zd9@DT8De5+8~thV2$9(0&*zK7@dgY#-S910b(Tv zYao}+;`ts5bUFbOlM^g1E~2VTO-<4X!qk=BP)z~op~o=~Kfq=*!zq1=M_yef@0M`X zrQWGiKYyO9vLEHvkvnk2V_{()*Yn8uKB~&ObLZGOI!dKdNw^bWMX1$kv|26HDxryY$iTn=?XZJH7L2Cv^ydxllTS{K4SSb8wtw_;Trb0WjTx+j zhzLd@?-n>PaU&c$vle9HYe= zK@f2I^cf0MH_;rbu~A>ct&MQHA>_-WxUQdO!pOqa5`p8Q!Zr&yIX8djSboA=ZZF{( zj{$Fx$LSc9?=!q#ZN}wM{Ws;LVleh)8m{fH8D7=UIRI&zRL?bmsm=r@l!T zhD1?_QHvq!vw&iyFB5uXcDb%cvs34~ksG;d*XPN*c|6DCOZ)C)qrJ+{Uw@2t)MOwx z$YOm7RmF8(cJJQJyEFg9T48K-lq;^dg4x+wK6PLR<>4v-PrbB+)N zCFV#gth3yhXJ=uYqE}+0y~1kqeXLkq$B%t0q#USLs}zexthHn^nS@|UB$w_l;##0_ z2zOo33Yu@V!xjTxi8t3?=ZT|_^3KK^gc|bOw|>E|kN=ov=R8@jz}nUtWd*sO27cx>*-3xj^;Gvk#>R+|eP zS^PVyf@@p`v%?H!cJjC5ukeYC%(0|x$FCD51gF6<@DOQl7%)P(*Iw#+MhUb@#P%1b$jzgyv zqEUhU<*z{JCjNA6i%MsO;i&_>)to>Z($^CRuo{=#q-q)<<2ecQdu4xHHM}GD7hYoz z9u+S4zD#*Apthq8D)??5WC&}sbVA|nv&y=BoZ*2gDpBupW_yJ+=HiN}+9RRu2k^*! zdwB5inZb73vU4cM-l-}X&qWmKt%ycwF@WzHN(GNXF3aa`*ug--|4{AsQ!g#yIwnPN zp#_|8|MXR_Bavc5|w@W!b+D_czp`3Nu=<0J=xh|?R@Fo+cdgGiiY(ot>O zXs3v466N~Y6hLV0kKS8p9ke3*Yt;;)g;VoQ7B_-Fo