From 6100cf8afbe1caa2ebc7bf6999db618f681b7267 Mon Sep 17 00:00:00 2001 From: "fabio.sinibaldi" Date: Mon, 1 Apr 2019 14:23:05 +0000 Subject: [PATCH] git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-publishing/gCat-Feeder-Suite@178798 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../dm/DMAlgorithmsInfoCollector.java | 14 ++-- .../dm/DataMinerCollectorProperties.java | 24 ++++++ .../collectors/dm/DataMinerPlugin.java | 10 ++- .../dm/model/InternalAlgorithmDescriptor.java | 3 + .../collectors/dm/model/ckan/GCatModel.java | 9 ++- .../collectors/dm/config.properties | 1 + ...hing.gCatFeeder.catalogues.CataloguePlugin | 1 + .../catalogues/gCat/Interactions.java | 76 +++++++++--------- ...hing.gCatFeeder.catalogues.CataloguePlugin | 1 + .../catalogues/gCat/Interactions.class | Bin 4001 -> 3986 bytes .../tests/BaseCataloguePluginTest.java | 4 +- .../gCatFeeder/tests/BaseCollectorTest.java | 23 ++---- .../gCatFeeder/tests/InfrastructureTests.java | 37 +++++++++ .../tests/BaseCataloguePluginTest.class | Bin 2690 -> 2742 bytes .../gCatFeeder/tests/BaseCollectorTest.class | Bin 7506 -> 6307 bytes .../tests/InfrastructureTests.class | Bin 0 -> 2134 bytes 16 files changed, 138 insertions(+), 65 deletions(-) create mode 100644 DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/DataMinerCollectorProperties.java create mode 100644 DataMinerAlgorithmsCrawler/src/main/resources/org/gcube/data/publishing/gCatFeeder/collectors/dm/config.properties create mode 100644 gCat-Controller/src/main/resources/META-INF/services/org.gcube.data.publishing.gCatFeeder.catalogues.CataloguePlugin create mode 100644 gCat-Controller/target/classes/META-INF/services/org.gcube.data.publishing.gCatFeeder.catalogues.CataloguePlugin create mode 100644 test-commons/src/main/java/org/gcube/data/publishing/gCatFeeder/tests/InfrastructureTests.java create mode 100644 test-commons/target/classes/org/gcube/data/publishing/gCatFeeder/tests/InfrastructureTests.class diff --git a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/DMAlgorithmsInfoCollector.java b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/DMAlgorithmsInfoCollector.java index db7922f..754aa1c 100644 --- a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/DMAlgorithmsInfoCollector.java +++ b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/DMAlgorithmsInfoCollector.java @@ -6,11 +6,11 @@ import java.util.Set; import org.gcube.data.analysis.dataminermanagercl.server.DataMinerService; import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient; -import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorCategory; import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorsClassification; import org.gcube.data.publishing.gCatFeeder.collectors.dm.model.InternalAlgorithmDescriptor; +import org.gcube.data.publishing.gCatFeeder.collectors.dm.model.InternalAlgorithmDescriptor.Parameter; import org.gcube.data.publishing.gCatfeeder.collectors.DataCollector; import org.gcube.data.publishing.gCatfeeder.collectors.model.faults.CollectorFault; @@ -70,18 +70,22 @@ public class DMAlgorithmsInfoCollector implements DataCollector { + + + + @Override public PluginDescriptor getDescriptor() { return new PluginDescriptor("DATA_MINER_ALGORITHMS"); @@ -60,7 +65,10 @@ public class DataMinerPlugin implements CollectorPlugin4`6%(UqKTSAHaBKI%)%5u$Z}X&%NjT{^y)Kcf0vbv;5`vr_TWT zpl`{OY-G#b9@JG$*Fqz4O%2EOcqW%BsP{94R5}|~wXNh^e!x=9!&`(W%*TtusM8Cl zgnEYCZ21CDsTDW#6s=AqDjO@vHI>Xnb2MjaTio|y%zZkW${3R9HJkL8`ut)s6qm@13HO~6_I73Y?n|V2|s~eZr zwOm%h3PW_uJ4QhlUSi7a-GHHuvq@e^_i)WK zcYuLo=^J6ENY_16i&Ap3v@kq88Faxc#b0Kz92%Q4pbct4vclR~fjP3@@%DBvTYQ5BBH{A-;vna5v%upY89|d)&%Wa zfe)*6jU>zZ9<*xhJKFb%*>{=Ft#3>GT0y+;6fHTS{Lw)W&)lgPor_eBFmzTzURDOXQu!B``6z9CgG>iCot`Lb-ix3 zs#32RfuT2BRon8{Er+v3BPdB(lb&vJ$#&~4>4&rWtP@DjFayhVXeK3aXv275=(fSn zZd5m<83^=WvK%Xz64*C-Zdo8zbZb(>J`CirAN>M@Wy_KCtwvRP6{BiPfqdCD4SU(} zEcG5wrh;|L7buqZOtc`7@nukP?@LGE*ka2GtcF~+e2Zw)j^hSK=uk+6QQ2sbzkXG& zxt=U!kQW$=Bh~a|({pP&$K}Nt4M#DY#*n~gJ#h@AANYDmV@U=KWDaj&gmEG{VvLqM zv0Mr~W}=|tcc3nVqU!{nYunNjxITJr*CAm-qcnC5F(}&1LsK^6T)ri++LITFl4vlq zw!UVxZ2HwPJ?r>^!5D{8EveNsP6=FjwRz(uC3l_V7wlHuax|R8KpJlglwNHrwiMB8 z`ySCUp4ALoPs14uD68-0@E+c04y-nH+3`o<*U{cWz9VAc|H@r|GYpBq)g74a z99CAsAyt|s!?K^ph*P26s1+()RZS!xHre5_CU9p5)E9HvbFHxBbb%x5LD0OY>yA6| z)4KHJgy}X^x<1a~6MRaMVb9$1Y=OJo+NL*lJ7Q+tIjqR^Xn3A>S_3z5Pv%BJfD1r1ZU zlE#+|bw_sEf{?>BuF`vI&z$sqqfV7RO5y2jjTK76HI&krVZo@LjOu0D_oWx)a9yce zYK?UzAZTGI@qHVLg>_&lFwFaNMl+WFv}{n8Bu|(*f!jUx`U~DZSEc95mpHlF&}rNd zSlN^P70-3*(aA?qY8XMn_)USEdomtojGpndO_*KUo&JT6JBH1gdLTVNX^WEonza;1 z_vPNRi+OhC;zWjRB5<%_`99CJ1J zvwV(MQqlZ9)}rg!kJ>9~R0S%#O`^I$ZMiC)Ew=o?ZBz`84Heai1_L#9BO1wK4eM#t zdDq!35OKDj>p581pnI_nDNh7`=~0WeDPqL*8bMy;-0CJeR1`CDm6_Rf`nx!+4klGi zj?rL6Ng3Mz+^l<~iWndUtKIfth91rk~ZNSw&492?-aa4vTV?+J8;CaTMo5R%2wmFM*-BXSp)Y-v=f>3_+J;(Bs=d^Anr+h{!7)rw)d( zyhP~BJW!_+@WkBf17^XvrR z9`_pTwJL^COQd! plugin:collectorPluginsLoader) { @@ -112,8 +101,6 @@ public class BaseCollectorTest { -protected static boolean isTestInfrastructureEnabled() { - return testContext!=null; -} + } diff --git a/test-commons/src/main/java/org/gcube/data/publishing/gCatFeeder/tests/InfrastructureTests.java b/test-commons/src/main/java/org/gcube/data/publishing/gCatFeeder/tests/InfrastructureTests.java new file mode 100644 index 0000000..0928f75 --- /dev/null +++ b/test-commons/src/main/java/org/gcube/data/publishing/gCatFeeder/tests/InfrastructureTests.java @@ -0,0 +1,37 @@ +package org.gcube.data.publishing.gCatFeeder.tests; + +import java.io.IOException; +import java.util.Properties; + +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.scope.api.ScopeProvider; +import org.junit.BeforeClass; + +public class InfrastructureTests { + + private static String testContext=null; + + static { + testContext=System.getProperty("testContext"); + System.out.println("TEST CONTEXT = "+testContext); + } + + protected static boolean isTestInfrastructureEnabled() { + return testContext!=null; + } + + @BeforeClass + public static void setTestContext() { + + if(isTestInfrastructureEnabled()) { + Properties props=new Properties(); + try{ + props.load(BaseCollectorTest.class.getResourceAsStream("/tokens.properties")); + }catch(IOException e) {throw new RuntimeException(e);} + if(!props.containsKey(testContext)) throw new RuntimeException("No token found for scope : "+testContext); + SecurityTokenProvider.instance.set(props.getProperty(testContext)); + ScopeProvider.instance.set(testContext); + } + } + +} diff --git a/test-commons/target/classes/org/gcube/data/publishing/gCatFeeder/tests/BaseCataloguePluginTest.class b/test-commons/target/classes/org/gcube/data/publishing/gCatFeeder/tests/BaseCataloguePluginTest.class index 47f5b5b21358fee9fbd530711562da4d9f3dcfa9..d3c0385e30fe9f5de8051ffe695a0d2f9cba09a7 100644 GIT binary patch delta 503 zcmXw!OKTHh6o#K~GMA=|Ftjvct0CU2F~&u@F%oTPkwUay>Lu3OG@Yc0F^Myi+IrcD zf1rHeLfjXZRhU`}>c)+N|3Ppo{sZG@#Kqw~2hRIG=R6yUMw~Cd-+usdJhjjSMY*OG zO$%L6P;Gj6rd9RbAoRPHuo^X=4>7gYRuCv5vEZ>7@?yv0FE-2A(EOMW(T<{g{6xUy#) zGAlNVcrtAkoSMxNwm`49>frzlxoYk)n>PEnFJGCX@iq@EI)d4??tKlSy7%AO#vc%l3epWM0Jr;RD;v>P!XC^068U-(f_v6OLag-&h9in=f{ zz5w3Dg%2Rn9hwXx@nfwEU%?mf6|5Iw32Zy*<9v|exAt7S(|HI*Y6XfM{WwT?o8mG^*Xh7 zy%h#+*IR7`9d9YkG;=$_d7Y9adE4d=3;K*4mQ|ZYYC4c(j%RZZTVU0j^)ShO{Y4&< z4Vxhz=-={yTp>_2U#Z!?77K!e?}g`0^Art5=cBKDA%y;w92j|vDKYO9+Y!JqyEB|T+Q diff --git a/test-commons/target/classes/org/gcube/data/publishing/gCatFeeder/tests/BaseCollectorTest.class b/test-commons/target/classes/org/gcube/data/publishing/gCatFeeder/tests/BaseCollectorTest.class index 95ea02fc3139164adeec5a3b387df1feaeec9d93..fa7e038595e6f34ac11c71b755a7d2ac79681174 100644 GIT binary patch literal 6307 zcmb_gd3+pY8GgRWG287xX@HazDN}l;p)6Msvu&YG8VOC(BWY+0sFU5vX4=ipc4oE* zP`nWD3$=wRD4;|X4?xod6bs%J55yA{#S;(2>ks}SKHnUBE!04~M9RVV_hZ6}k+qzZjzB5im^B46msTJC_A0irG-G;!tpZDy2T-#HUEh*5TsPS`(IvAWaHfVD)T)>#aK(vzKdljQG~jF%^NDl{ ze`B!T6b)Mb;F^~)Q}2-hAyPtHaH z7pb_AR+pR=z146rE}@+{bH68WMx?>#!KS`lOg4Z0Dh-$6l>+L3;dc3=WZcdeUL~-w z%hvOLe(08~lVJrTn?0aAzLln9ru8_ISfgUKz-f{(fj#S7*K|A$YjK6ZY!Z&Y+KjBr z;MAALx!ZGC4w5??duO8_>olxKi@+)5Zma3094qgeel>y5l#PQ-mTV%3Nl8~y#fFHG zz83-j>kC$vxgSR>7RPZFu2#`bdwhqMIZMMvbTBA{=Z8w*^a__o@oPnwhE3QkP;2D# zW{&J$S#EXc`Y@goaU^5dN=NDReF?g5?$6tYP}wHmI&^$bT4zb@PBDrB<)%gSvD<;x08WSt+<*J^m3pK3DsV(1gVY^2ez zf>iJcQ(l%eWH2C5V>*tc{E8EA)HC4N`(%bE8+&8eMUQRE$)CDs>vFq@xYF*dO!+|; zxJgtt_QqjjkBYoN+y94W8XW0ml}za}23fU}U^Wyag6e+5%Eqw|2UP5@AX(r_4L9IM zF5PQn3+ASNfu-e;Bj=X+JB&aK2U%~LC23OZwrqR_)79NVK5sjonU?wWdJS*D8wKVQ zR(JG*oj4HgIgmG5mgYv34jZ5>5pTv@RNO))luAsuNrP_1TWOGM-N0b7WVA~=->%^u zGV9|3YkHi5DHSxu@NSk9;va2YcyLE~4y&B$!_X{i{&dtHlU^*>! z&U0kTmUpGa0^7^|6FOtMdJ&fNph!%inOXP&fpbE{j>%GG?lqkWXg{Rk5Dp8RO|)Ah zsr3gc{CaXIC+V?Ku!~WrC0draT52xrkt7IRZKf}X<8Ium;vRu(PcAe2jY5|5WicA8Vnyn2 z*q<`M|MY`+z1}wHoQr8c0(a$UzR!(B)KnOc6R3C?Iro&(9c8Bd4Bd zu!}Zv+qz4IAU=>%-0s`|=rP0mo^ z_vWoL#ypOctD9!5A*@yf*Ruy@k@61`wp2!Cy3>gY+b0W$Je)YC+cQ$TJB_?=tcri| zGon<9OLSpR?Y0X}%4}m5p|d6&^IRZTVIiAd6;F;7%$Mg6yo<|kdp@1zKb0TtF@88` zd~yn(tm0Mvn_DMFaO%T2qpp4gXFZGs5AvY`oqyxJ0`s`6f$HT`a1lTILlp^LrIMNz zN3p21tk!>cy1ztEPj^Il3d@=7c<_YxaXDo<1;AHsrRtmquVY3GmP z0)b;>$1M>2ajC$Ou@~wtpML~u^$@D7M$jBdi~f>y(3J9RG*pMmB!KrQAhdB(w~d$j;AB#_ zkC!^)OATRpb8TQ?ZOOp9XhlQqFg_OSO$#MT-?!c4cK<{OZxlm9f(v8t^5GGD`VMhc z(f2hKzNhRcKFa`%^G1KUHzcfwrP*JsLX*4_^2$++C(wLQe)lCHD+r$poSA z1wub4YKmO*(u3r>iQUNIX*?r3#3tM=jw$U*2afyKJ>l;|Z2HxHk_}@ev*282h0f2m zg-kV_DYh6FGGkhqFB_RHCRR{q6Y@OKx{30)@$F+gmwHCpja6bPE)yM`cDLYiaXpWm zJX|bp#u{-amWum$TJr#pVvb>>c#=mi&!bcP2VF`vHYulKv$7OhlvTW5fexh|JxV9G zDcjMj?7=mPgYC*e>`)G2r*atAD)-FLP*Zvt*L@Do{e&;bDv@xFj3f46h`^Kn*w+e4Xxy%?YA$S$_T%q#VgSSsF%7hEb zUxX{`Xkba&-)4-b2xSksRz9ZG-D8Y>*_!~>7)cNzJZp^Av?TFjB(Vmwio3iRC{%f9 r;BPm7jP-SrHPY??ncVw$n)~zrQ)BdFwB4BOA!HfD`cM8<@UQ;@i~CmH literal 7506 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 diff --git a/test-commons/target/classes/org/gcube/data/publishing/gCatFeeder/tests/InfrastructureTests.class b/test-commons/target/classes/org/gcube/data/publishing/gCatFeeder/tests/InfrastructureTests.class new file mode 100644 index 0000000000000000000000000000000000000000..e702857c3583acec94b5b83921664e6c1dd9e7da GIT binary patch literal 2134 zcmbtVTUQfT6#fnuCy67_$i*9)dZ7d>(^h*UXq7Zr1VK$2#a`%SIKbd!CTr%5mHw0V z5A?+saV@ZQt@_r7zW2}cq3w4jsR6-gT^MhaUg~6 z40_OKpm$e@@z4IIcG46F#~yl!%0HB zQ#Em3LpB;Zd(UTLbFMGv<9bbo6}#q1-NV4Ky{a9$`aKb5&mF+yZX*XKndLpT`(M!f1y%YP&t;?z#xiq}y`+>5R z8~DUHlwe$s$vtaIt^}bhdUh1CoC2Sk_y89T5J!Jfr&zfjNs%zjl~D#0unds1lm8>p zDLazI!1Fj7L8x)2aFrFcRPaFh(RgEr`zd^GpvVTaX_ufgQNlEvN50>YQ4oiYycRWi zDv*CYZP@1-zY+gOX^sC26EnEMmU)5AiXLehzoMD18kiF}*2d8)Y3Y$88@iMk%wk@* zf1&LpSpt={F!)~gtB@znCve-u9h5n&4i|#$`q8Z9u3)3&k>9{ENi~7K4B;-B_)gDQC#jl74a)`` zfzdtilRPcE;aX*#@lJ$BMczq~?p4uD|1 z_F~*&%ezcDq2RQuSHqFrv#JRmjceX;yD?#YZD^oZI)8N`1%v+rX};a&yZ$>To+6Vq zpWzVCO&orXp~dXcZ5-c3W(%jbaAphdJfUI--sLl!n3;U`!bBg=@?&rzxz(Y#k6P|6 zo`Ul3v2BdE%?~8POk!d-74RP3r(!bwlxS=hlN)F}ncvaf^|d-XFuD*wJlu#8HeVcV|MZU zHg3KcOY*+;6Na@YsYYdIHMUWGv5C7)wQsiY?IvuR{DPGZJYm=#9K{K&w$Pp?B;XhU z9p}w3?@nR_r*H!~++~kyIFn>DNQgbCz{NWChY9=vJbKgF^`q+_x)cWa%*Sf_%wPQa K2-JDk0smix$}P|U literal 0 HcmV?d00001