From dfdaf6ded9da615ed62352df458b3650cc8387bb Mon Sep 17 00:00:00 2001 From: Dani Minguet Date: Sat, 19 Nov 2022 20:39:37 +0100 Subject: [PATCH] Trabajo Spring Core - Videojuegos --- .classpath | 51 ++++++++++ .project | 23 +++++ .settings/org.eclipse.jdt.apt.core.prefs | 2 + .settings/org.eclipse.jdt.core.prefs | 16 +++ .settings/org.eclipse.m2e.core.prefs | 4 + DiagramaVideoGameAdvisor.PNG | Bin 0 -> 49946 bytes README.md | 78 ++++++++++++++ pom.xml | 22 ++++ .../videogameadvisor/VideogameAdvisorApp.java | 19 ++++ .../VideogameAdvisorHelp.java | 33 ++++++ .../VideogameAdvisorRunApp.java | 96 ++++++++++++++++++ .../videogameadvisor/config/AppConfig.java | 32 ++++++ .../dao/UtilVideogameFileReader.java | 38 +++++++ .../videogameadvisor/dao/VideogameDao.java | 13 +++ .../dao/VideogameDaoImplMemory.java | 71 +++++++++++++ .../videogameadvisor/model/Videogame.java | 80 +++++++++++++++ .../service/VideogameQueryService.java | 14 +++ .../service/VideogameQueryServiceImpl.java | 81 +++++++++++++++ .../service/VideogameService.java | 61 +++++++++++ src/main/resources/VIDEOJUEGOS.csv | 11 ++ src/main/resources/ayuda.txt | 50 +++++++++ .../resources/videogameadvisor.properties | 3 + target/classes/META-INF/MANIFEST.MF | 5 + .../PracticaSpringCore/pom.properties | 7 ++ .../PracticaSpringCore/pom.xml | 22 ++++ target/classes/VIDEOJUEGOS.csv | 11 ++ target/classes/ayuda.txt | 50 +++++++++ .../VideogameAdvisorApp.class | Bin 0 -> 1072 bytes .../VideogameAdvisorHelp.class | Bin 0 -> 1473 bytes .../VideogameAdvisorRunApp.class | Bin 0 -> 5537 bytes .../videogameadvisor/config/AppConfig.class | Bin 0 -> 1201 bytes .../dao/UtilVideogameFileReader.class | Bin 0 -> 3324 bytes .../videogameadvisor/dao/VideogameDao.class | Bin 0 -> 473 bytes .../dao/VideogameDaoImplMemory.class | Bin 0 -> 3872 bytes .../videogameadvisor/model/Videogame.class | Bin 0 -> 2712 bytes .../service/VideogameQueryService.class | Bin 0 -> 686 bytes .../service/VideogameQueryServiceImpl.class | Bin 0 -> 5920 bytes .../service/VideogameService.class | Bin 0 -> 4323 bytes target/classes/videogameadvisor.properties | 3 + 39 files changed, 896 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.apt.core.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 DiagramaVideoGameAdvisor.PNG create mode 100644 README.md create mode 100644 pom.xml create mode 100644 src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorApp.java create mode 100644 src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.java create mode 100644 src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.java create mode 100644 src/main/java/com/daniminguet/videogameadvisor/config/AppConfig.java create mode 100644 src/main/java/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.java create mode 100644 src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDao.java create mode 100644 src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.java create mode 100644 src/main/java/com/daniminguet/videogameadvisor/model/Videogame.java create mode 100644 src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryService.java create mode 100644 src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.java create mode 100644 src/main/java/com/daniminguet/videogameadvisor/service/VideogameService.java create mode 100644 src/main/resources/VIDEOJUEGOS.csv create mode 100644 src/main/resources/ayuda.txt create mode 100644 src/main/resources/videogameadvisor.properties create mode 100644 target/classes/META-INF/MANIFEST.MF create mode 100644 target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.properties create mode 100644 target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.xml create mode 100644 target/classes/VIDEOJUEGOS.csv create mode 100644 target/classes/ayuda.txt create mode 100644 target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorApp.class create mode 100644 target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.class create mode 100644 target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.class create mode 100644 target/classes/com/daniminguet/videogameadvisor/config/AppConfig.class create mode 100644 target/classes/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.class create mode 100644 target/classes/com/daniminguet/videogameadvisor/dao/VideogameDao.class create mode 100644 target/classes/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.class create mode 100644 target/classes/com/daniminguet/videogameadvisor/model/Videogame.class create mode 100644 target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryService.class create mode 100644 target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.class create mode 100644 target/classes/com/daniminguet/videogameadvisor/service/VideogameService.class create mode 100644 target/classes/videogameadvisor.properties diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..2e60bf0 --- /dev/null +++ b/.classpath @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..6cfeb74 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + PracticaSpringCore + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..ea7a397 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,16 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/DiagramaVideoGameAdvisor.PNG b/DiagramaVideoGameAdvisor.PNG new file mode 100644 index 0000000000000000000000000000000000000000..8e15485ec3c4ee50f50074117bf809a945460447 GIT binary patch literal 49946 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

B|4$J4dhR1`Ju+VV@O+*kKJE zWOZ-IwBdWVR}H2I6^}mr9(7rt)#B3`3#0)?JlQ;u7yhs6#SCA3;U*9c51dD#EYHtA zU4Dx33YJO5BxoZL3iA08V!c6t2uRH4=2xGi4~c_^xLiH&z`X(o-EycM%%n(VB15h-7oq$0(YGNH2T%q>u+6TsFm?Gmi+1nSF0WR#B5H;F9 z^Is~W|MDVXLyNvMJJ7Qzjj^AgXeRt};{{PIo7p@-{)pbZFZiTW{Z*O$d9wloaY((L z5n#s#Q&8B-Ji&p?H+XS0RDns<}ynI;+5Am5YEA{k^?c4Z^_5Hann~ zKZa7ZkV<4BfP#Yn?TgI&|D45KGj&dvAPC&vEaH`Z(oP^6tbZOQ4T+=y8qELwcbmX$ zS=}si#ZxfgMJ3%p*p_JpG<#gP?*3~>zdK1a>Izc4qybbjlK$|YvkDt})X7Z21I)EF zS7W@eU=!XW%d7enp-npk$A zFE;o7$o`Q+d*DH+)YkG~{x#s0s;d7?DvbkEMZkDV3Mm#qip_8)=K*&FMkFulAQ1jC z2mv6WF#{u7!tTkMg;BS^Y_=d;aA)@@xO~pze+&|SY{wBXiX3z3%GN{E$#74*3_GOV zHn@W6g#&Nh=kC zz+-YBA8R=DL(m28)n`=rN7-UhjRGTrW|B|t5lAyGX4E;id3U^EaUKU2A?JE;EsL5B zyI6*tIzJ##am~jt039Rkmwh~1L|aF7GUL&10T7lAoalOc#a8d z)CwE^dJNUuHWrj0trFe4H-{+4UQ=E>{LJ?$Lh)qb=eOQxfo>sBDf4c`B}UIA01H=+ z5sJfy+yE7V5g6vwr*ho1n#J?>9(4}mX1yT96s0`^?bW2zzBTs@rDY^xb)uG1;oYTm z-Uk9(PO7Eil8C5%6;JMWgzig-4l58~GZecI`%!&1^wEoYfHbZ>i+Q37bS*a?kQcfm z*9;|gyBZ}8?gd+KE1>Vinwj}BP6Jx=P5jH(>T`(djBG5Q@}6cowJGSVZ!ff`vFDeQ zwNXwv5bXd((W7gegBOSDuTg4`1zmWx@R}~V)~hS%p#X?G^!3GoD=lJO?~JBe7J1Vo z#w9dVwI=<8IR%xq9&GXt;0Yfu^{1| zLyY!&_SEOJ7z?O{56&g$B6A0gDYLe~llRuHq}c%Tum4&0-s{ft`g>WG%!)e^**D7Ah zwz0n;8O9wM-mj2o+stLFlbq28?}{=kkJTThR0#1g>kT#%zhHVQP>@)6JzZDqJOuct z1JQ)wUF^$op*e=MS`vRI@Rf?8Z=c@X@tyVS(&|fL5%B!RAWKn>(wt*n@i{ zw-6wOQstufcT%w9^`Z{{S6mM#awxSspkEc^gg+V%JUpue;8c5Mc98Ju1wr2Ph-l*h zXj8thJ2EVAVy>+IoArvD5mePPF55!x0&p~175LRV7XXog?KSv|Byeu)O5EwUD%Zj_ zXFo7#JV_+a1)WSHxqf+`dP5hU@G>2tjJMiaQ8Xo z?i*)r*+kn#KIN;-XBjH9i`QyyN39waU^Enn-8}?OnSL zV%kdLGl)SbeYRU4!B#>=KdZ(M0b#9ZDBP%dpJs2_2zW+R@)_sd7J>nIt+2xWlo)Q9kAOoy|T(7bxx(JUQQvvTh1h$aGA`J=gkv+ zi%*S+K*GTtF`O4}=p;450pb37-OkIZWfAi)03xh)>b+|mV)3ampoHQ{_4EtN+&fN9 zz^1i^xcFL;x^~q4q@XcEX(wlwG30Ul*%^Rt`$;qkTs8p-*8t#42(r7Ipivz%bVL?ACQK~^ zh;E$(F7nuazL9)Fc;q7Tl)C&uMvRacNasLBL8YX-q&p-81~YJzmYj^3I2vJ&8eQ$D{*{!&LwMIP>GN|b8|zWfu!bkSl? z@+!tQyGmAVmGT0%G#$f~3^GO2m#db%Yo+XPq)zH}ko(*;4Ib7G?z5eN3l#%w1aPFmhc~8G6#!%uyJ{gd zcNlp^Q;SxAE0}lB^+70;X>(bD;!p2^tg?=aVhFit)B^VP=88K1?4EOf|NC6WwHSp( zW%`vo$l{no3H^)~sN?IfG&=kuDId8w^M!x+$=cs?>Q6HLdS&PNoTh zV~TckU9AeR23N5Zx9ckOBI%vWudb?xJJWi*f@K!^jD<7oH*72Ww>M5V*(-YnO%;SI zRV0}Rqej9{rU7+&ozen({to|zI@XR`4YH}X=i@rdpn~6$d;uH2(%|&)anw>HQ=pE(kGXkNV}b_R~uj)eu5M13#6ngE-PP^~)kiwQbWG zCC32?**dW|<)qXdqqBPI=3T+Q7b98%UVI&TI@&=m@8tngf~B^pbf3PRF+6j%!X#BU zL{MKlba^c>m>6Y#Ce*S$v6UA!_=&W)-hz$@}_RzU_-r8=nvx7}4fSF3M_d zX`#Lj$jTBX35lbtKetlPEFu4@SvfYL7^L435(piem~JMbj5Nbx^v0XuB*kEBQk~Ul2DYwp;%u7OPeOF3j(qC z+kIzRpWLX*IWp5yr%{?&LJYWBzVv5frlxP+0|rZ6>X;4ZX_+*-_Q^G~O93(nov#;;$GI%(O_Og2k7#6c3|xLMo9_lZF&NiR-ozGOct4D zO3waR0Ou|ryB?fUUhvuw*K4ntp;K6QQNPi9l)!ujYhsM+#mIWkXy&HZZF9hC9Tx{6T;Vx5l$1c~NA-`}&!CUnD2-D~qVniPicV+#| zBC>C!Uk~kx5+wvKgHqeLHb2{r7Vc<9{I$c}Ge1ZAQ~7PZZz{T!G~jnGMh(MFw4h~d z_W6+c>Nc=zVGbVx^}c!xQpZszq-a!E?z`FIz)owmQ!JMy$l<`vdDD8gVX#lkvZ1>K zR|O&Wx;^x>h40#*HagrXwU6tt=<4{$t(4-?&E&ABIG;0LRV(C5 zhA>?VwBPIv$S@a$EjeyBwin6!R0ccDqRIdh- zezCM-*1S}?W;qaDQ&n}R(}2@*qVm_)-%I=1Ptn{A!H$`Oer|PJ^^|xELOexf_sV8p zKaQGHwB7rDgSy@ALki};oIPh}daD)k*G8LjBL3ijJjiMFM~YN8M4s;)zYFwK_TbI9 zClHz3k^kD{rrwL+)1A7Eh$loLNBf&5It&=0kWi-6i=B2og0fgyRn7V_aoxraUI8+m z$PafAmDW*Owl#?fuP73TviLD6ZB+l-CosFTC?I%sb4y_si3mJnAL8nZkKR^XiIJ2l zK^XzW8+=?}>NkAd{bo1%+{2akO8eGTh%&TF{jtratVPkuOE+oY?Ks3+6O2!)tH7t0 zxYF)%FZ*6j#`lfgM$=hg316kBJU{?c-I+Q;p1ZO8l`-9z0}{{4{NhvftND(HKd?u! zQd2l`*`3l1h*-+&R9AI*$05|Yp@KP|!%)8uEwM;zsSgfuxbb@rg|nMqT32Y1zTAFhy+r0~=C?R8pNQY@qPh!a`&A;`V z-$~mGFKR)MxaU6{vE#0@Yggap_<~exzhk*!MR_PpIrQ@N(Z2xLn%3UJ(a>2CdWB*$ zkqiwG0d%szelJ1*)(?}9x)HljHuxL*=|smpW?2ueCxRvy_=~?!_6E5`uVo)42MgtV zSiIePX#e$KXV|A&?qAL^@UG7fZ9n7RdiEsyP(~bz>bvLK{0j|m(S6T?RyuNX@Nu&r z`xm3w4pI7VC!8kCWLlEaeepZ3YKJ}75NhW55W8-B z=f@<=K&RP9{P-@^!R-hIo6H9ll1}XY2;rHud(QzOZkLjOw=InAou!|pl)MW#+lj|O zJ=OF6*KN)#0Vp}MN}$qHQ@bjIo_EP7P_t30&p1IAe6smm1;(#~Sg<;pfk&+pL(#pxu5v!a8;;quqHT|OzAR;sR|zG{`fIdC(bn_~K5OfwS_ zq{wmq^|T7TdVzcTXAs;@WfoE*S7$cPjDN0njK1Nz^kqU3z8$agnsg_AlJA=}x<%vMIPi%bQQL92S)d^7>)fef;B6cc!J8M${Pd%Ls`DIs$ zFF*cS8FK>`FzmAogufW%SkPV7YFt7PqL;XVI0ppK7is3><&JLu+{mVQ@0n)h3(oK& zrfinpqtb$h*Tmgq1kERde>p_4IzyT5Z^}T+N!Bs(W8WVepm<{p;Hb(XCCPgD#*vqf z)C5U=yZ6sxd)|I-UwDP#<`{5kS*>~hD6xxe))22T5rTzaW5#>+lXpWb@1<&JT=b?p zxYXVw>6l=Bk<-560lm#JnGKWLq(`(5eyCLPn?T}1?ek!M7Wkz`>Ar~uhi-W2sWzEVh>rVhN89PhJ-xCvuyJ|^xtgpb+32nRh!Bj za59*zY#p;n3z#csh-7E@A>%9yeg3ImC8JCzjDur!_5P7>X8{4o^y_?*7_|HyrM7XI zLqfPegJ`4DUmIV_s&YW|Ai}I6`|dxsDLV7JcO37gbU@_6|vq3 z57<(oap>}fHk0C(mKG}`tAuC0DaRL=ne(NjqG|5B6OtkIpu630^DX` zS9t%v8$i91HLnH0Gwv*t-oB;Rn{JRqa%Vt9%j+Do6J@7Hd=&f zsOziP$@>H%&sybOV(rc@FQRDP7dh7Jf1HcheCavZHq-4@(AqMh&>fR6=(mYN0zzM9 z2)8xUuP7ou0}$Jk_oWSLYpdU1hS;K@SAKD}O3U?~ov_!J!{R!H=Fn^Xt7nwpueOlt zfsv%RPPClY3qmAzsj+Ms(pk73G=3{fq5&7M#bF!f&V%FampiplomJl2m3OY;?gSm$kL7@@@;-4xlJ4N7V@4d1%zdVNt)fc0Szk6=1?I_jmQ)1u zecxyfQafw6O?E9L=-z=5D|p;Ld)j~4@vNr8WG-4esWOjU3@V=6g#YUPT<`+}?�X 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%0D{b*Uo#@(P~>D!q= z=T_I}oRZ&CfWjHrj;Q%|!A2C*!`uJ*mG3K}Sy^ytEXj8dWF<=-ydlrvHX`kkDt|B) zVQO)pP#j|ZwmWSuL?8Nbo* z6Do6#=*ywmQq57)Y1- zhw3T#KVY};9z6z5-oF8bsvubronIjs_Tl1Vo2tqvQ{H|Dqqrqe$& zHxaj{sLHPuPQ2zn6Q^&NGbWYBQ7Y4IjSO+%J5jtm8tQLM_rf}8#DzBMn{Ow{HAcU# zQZ?F;o2#$?n_W3(A{D^_h=#_X9KmV*A~{68nMQ_G#!E$BDJtYZd2ogObzj=}fpaW4 z1~@~!7eCYb%m&htf}W2QA4Dv(LZlJ7Iv6OmDb?T$JFXm-pNU?Xh*FCC+#g*hBk5U$ zp-t69HX8Qiz7Fy`^54w@T!6o3{TQL?Ip3jk+=tr~+c+~OJ3+p={tm{AyW$foq@~g( zRfNL8E^LAl>7hX^lq9x`<&DNKdJlKoMdEQ6{?ji{6=a2sSNCp7Sh{E0TtbB(J3e)V zyI!xcyKjMn3jf*_&+Qa=)f8chjJVC5_)^y4Bdhw;LoEE{|7t~x4bslMzZ#%A6ddwD z5VCB*Ablb^%inu{ll1?<;tVA~CIhVz$obf<;rM$Jlei=fRD*H+cawi1+<*1}sKouU z(~KUSSPP7TQb~X3JL}Ns^(AxX)2USlJ`J-Vh2R?Nf2|Crhb()zkpprvRdL~BK+TOT zY24diZ5YkN)6tuDZNSCX*pa>;5r6-mTlC+Rcn!`b&5Z%p=JL~Qpn5}aPWpvl5&S+N zAb$UsVe)4V?ncHlEry;oO5*Uj+wq2Ja^eI0>9o2ySBT@aUt8FRM7zN|u<0JaVcce| zs*=PhUu0CngRH4z+c;6_&TF6l_ho*EFD$DWx}w}6VM zyKScx`Tll`)$7jGJ+KM-2Mq@(t^a?Akjh24kxk(#aPL$1Ww9r1 zS@fnV3@?tD_gp9+en!+wa^GjfpCfK!kETkX@?mlsg!}A}C+J;wfx{|Y#HSA2SUp2R z&b6zD7Nm6E>7M-%`01XA^|cF#!U$0fUw1`eE(!abFpKFO?|#kLRza+>h_vW1d?wmv zLu?G*w(ed(%*+yzk?fsLOh;eHqIZ%mjD95HY03rUO6}e09y-`KKPBp2J>Hb;IJleE zIGFy5xODc=_mjWS4~-85IQdWR7}&BfOW8 z!+PsNTl<-p2-KB4<^y4c@HX;Fz#A#yFQK>44FUI$27g?!3Ea44An!cyAgR4p4A)&v zptw}Rp0uG}@4rt8Q*714MOwh>011;%`z1|Q@}IK5HN<7yr2nwZ&}qYS4R2TUv6VVl zP)rUX%;sTOTi*PY`958&<}<|BmvZdwLEsyyQ>%8(x2oJ!l#E@fx%hPYi8^ML;9yWB z=p(S~HGB1U4YlNM{^WJOFCZPOIKLF7aai>3ElyqP$0GEhTk=1+^gRz_Z~bVOed_r` zc6|Ov*Tb?(W@-!WS2}3T>>H-$#$|$I@E@C~`7(5DK!_+7-Zph`fLcs@F+5UxyM+Oes z>;L=);2C+)1i#O?J28X2z=meH{^Q1Pm>zs~02SXL576V>@BEAZY;f0q0TYU)NcDj% z&zpNFDJ9j&>GvuE@ns5v{C6*bhDOsS + 4.0.0 + com.daniminguet.springcore + PracticaSpringCore + 0.0.1-SNAPSHOT + PracticaSpringCore + Practica Acceso a Datos con Spring Core + + + + org.springframework + spring-context + 6.0.0 + + + + javax.annotation + javax.annotation-api + 1.3.2 + + + \ No newline at end of file diff --git a/src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorApp.java b/src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorApp.java new file mode 100644 index 0000000..76760c1 --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorApp.java @@ -0,0 +1,19 @@ +package com.daniminguet.videogameadvisor; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import com.daniminguet.videogameadvisor.config.AppConfig; + +public class VideogameAdvisorApp { + public static void main(String[] args) { + ApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class); + + VideogameAdvisorRunApp runApp = appContext.getBean(VideogameAdvisorRunApp.class); + + runApp.run(args); + + ((AnnotationConfigApplicationContext) appContext).close(); + } + +} diff --git a/src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.java b/src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.java new file mode 100644 index 0000000..b4735ba --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.java @@ -0,0 +1,33 @@ +package com.daniminguet.videogameadvisor; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.stream.Collectors; + +import javax.annotation.PostConstruct; + +import org.springframework.stereotype.Component; +import org.springframework.util.ResourceUtils; + +@Component +public class VideogameAdvisorHelp { + private String help; + + @PostConstruct + public void init() { + try { + //@formatter:off + help = Files + .lines(Paths.get(ResourceUtils.getFile("classpath:ayuda.txt").toURI())) + .collect(Collectors.joining("\n")); + //@formatter:on + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + + public String getHelp() { + return help; + } +} diff --git a/src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.java b/src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.java new file mode 100644 index 0000000..dd06473 --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.java @@ -0,0 +1,96 @@ +package com.daniminguet.videogameadvisor; + +import java.util.ArrayList; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.daniminguet.videogameadvisor.model.Videogame; +import com.daniminguet.videogameadvisor.service.VideogameQueryService; +import com.daniminguet.videogameadvisor.service.VideogameService; + +@Component +public class VideogameAdvisorRunApp { + @Autowired + private VideogameService videogameService; + @Autowired + private VideogameQueryService videogameQueryService; + @Autowired + private VideogameAdvisorHelp help; + + public void run(String[] args) { + if(args.length < -1) { + System.out.println("Error de sintaxis"); + System.out.println(help.getHelp()); + } else if (args.length == 1){ + switch(args[0].toLowerCase()) { + case "-lg": + videogameService.findAllGenres().forEach(System.out::println); + break; + case "-h": + System.out.println(help.getHelp()); + break; + default: + System.out.println("Error de sintaxis"); + System.out.println(help.getHelp()); + } + } else if (args.length % 2 != 0) { + System.out.println("Error de sintaxis"); + System.out.println(help.getHelp()); + } else if (args.length > 8) { + System.out.println("Error de sintaxis"); + System.out.println(help.getHelp()); + } else if (args.length == 0) { + System.out.println("No se ha pasado ningún parámetro"); + System.out.println(help.getHelp()); + } else { + List argumentos = new ArrayList<>(); + + for(int i = 0; i < args.length; i += 2) { + argumentos.add(new String[] {args[i], args[i + 1]}); + } + + boolean error = false; + + for(String[] argumento : argumentos) { + switch (argumento[0].toLowerCase()) { + case "-ag": + videogameQueryService.anyGenre(argumento[1].split(",")); + break; + case "-tg": + videogameQueryService.allGenres(argumento[1].split(",")); + break; + case "-y": + videogameQueryService.year(argumento[1]); + break; + case "-b": + String[] years = argumento[1].split(","); + videogameQueryService.betweenYears(years[0], years[1]); + break; + case "-t": + videogameQueryService.titleContains(argumento[1]); + break; + default: error = true; + System.out.println("Error de sintaxis"); + System.out.println(help.getHelp()); + } + } + + if (!error) { + Collection result = videogameQueryService.exec(); + System.out.printf("%s\t%-50s\t%s\t%s\t%s\t%s\n","ID","Nombre", "Desarrollador", "Géneros", "Fecha de salida", "Plataformas disonibles"); + if (result != null) { + result.forEach(vg -> System.out.printf("%s\t%-50s\t%s\t%s\t%s\t%s\n", + vg.getId(), vg.getNombre(), vg.getDesarrollador(), + vg.getGeneros().stream().collect(Collectors.joining(", ")), + vg.getFechaSalida(), vg.getPlataformas())); + } else { + System.out.println("No hay videojuegos que cumplan esos criterios. Lo sentimos"); + } + } + } + } +} diff --git a/src/main/java/com/daniminguet/videogameadvisor/config/AppConfig.java b/src/main/java/com/daniminguet/videogameadvisor/config/AppConfig.java new file mode 100644 index 0000000..9e221f4 --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/config/AppConfig.java @@ -0,0 +1,32 @@ +package com.daniminguet.videogameadvisor.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +@Configuration +@ComponentScan(basePackages="com.daniminguet.videogameadvisor") +@PropertySource("classpath:/videogameadvisor.properties") +public class AppConfig { + @Value("${file.path}") + public String file; + + @Value("${file.csv.separator}") + public String separator; + + @Value("${file.csv.list_separator}") + public String listSeparator; + + public String getFile() { + return file; + } + + public String getSeparator() { + return separator; + } + + public String getListSeparator() { + return listSeparator; + } +} diff --git a/src/main/java/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.java b/src/main/java/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.java new file mode 100644 index 0000000..df464e4 --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.java @@ -0,0 +1,38 @@ +package com.daniminguet.videogameadvisor.dao; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.util.ResourceUtils; + +import com.daniminguet.videogameadvisor.model.Videogame; + +public class UtilVideogameFileReader { + public static List readFile(final String path, final String separator, final String listSeparator) { + List result = new ArrayList(); + + try { + // @formatter:off + result = Files + .lines(Paths.get(ResourceUtils.getFile(path).toURI())) + .skip(1) + .map(line -> { + String[] values = line.split(separator); + return new Videogame(Long.parseLong(values[0]), values[1], values[2], + Arrays.asList(values[3].split(listSeparator)), values[4], values[5]); + }).collect(Collectors.toList()); + // @formatter:on + + + } catch (Exception e) { + System.err.println("Error de lectura del fichero de datos: imdb_data"); + System.exit(-1); + } + + return result; + } +} diff --git a/src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDao.java b/src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDao.java new file mode 100644 index 0000000..b64e9d8 --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDao.java @@ -0,0 +1,13 @@ +package com.daniminguet.videogameadvisor.dao; + +import java.util.Collection; + +import com.daniminguet.videogameadvisor.model.Videogame; + +public interface VideogameDao { + public Videogame findById(long id); + public Collection findAll(); + public void insert(Videogame videogame); + public void edit(Videogame videogame); + public void delete(long id); +} diff --git a/src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.java b/src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.java new file mode 100644 index 0000000..3df2cd0 --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.java @@ -0,0 +1,71 @@ +package com.daniminguet.videogameadvisor.dao; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import com.daniminguet.videogameadvisor.config.AppConfig; +import com.daniminguet.videogameadvisor.model.Videogame; + +@Repository +public class VideogameDaoImplMemory implements VideogameDao { + + public List videogames = new ArrayList(); + + @Autowired + private AppConfig appConfig; + + @PostConstruct + public void init() { + videogames = UtilVideogameFileReader.readFile(appConfig.getFile(), appConfig.getSeparator(), appConfig.getListSeparator()); + } + + public Videogame findById(long id) { + Optional result = videogames.stream().filter(vg -> vg.getId() == id).findFirst(); + return result.orElse(null); + } + + public Collection findAll() { + return videogames; + } + + public void insert(Videogame videogame) { + videogames.add(videogame); + } + + public void edit(Videogame videogame) { + int i = getIndexOf(videogame.getId()); + if(i != -1) { + videogames.set(i, videogame); + } + } + + public void delete(long id) { + int i = getIndexOf(id); + if(i != -1) { + videogames.remove(i); + } + } + + private int getIndexOf(long id) { + boolean found = false; + int i = 0; + + while(!found && i < videogames.size()) { + if(videogames.get(i).getId() == id) { + found = true; + } else { + i++; + } + } + + return (found) ? i : -1; + } + +} diff --git a/src/main/java/com/daniminguet/videogameadvisor/model/Videogame.java b/src/main/java/com/daniminguet/videogameadvisor/model/Videogame.java new file mode 100644 index 0000000..e426dbb --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/model/Videogame.java @@ -0,0 +1,80 @@ +package com.daniminguet.videogameadvisor.model; + +import java.util.List; + +public class Videogame { + private long id; + private String nombre; + private String desarrollador; + private List generos; + private String fechaSalida; + private String plataformas; + + public Videogame() {} + + public Videogame(long id, String nombre, String desarrollador, List generos, String fechaSalida, + String plataformas) { + this.id = id; + this.nombre = nombre; + this.desarrollador = desarrollador; + this.generos = generos; + this.fechaSalida = fechaSalida; + this.plataformas = plataformas; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getDesarrollador() { + return desarrollador; + } + + public void setDesarrollador(String desarrollador) { + this.desarrollador = desarrollador; + } + + public List getGeneros() { + return generos; + } + + public void setGeneros(List generos) { + this.generos = generos; + } + + public String getFechaSalida() { + return fechaSalida; + } + + public void setFechaSalida(String fechaSalida) { + this.fechaSalida = fechaSalida; + } + + public String getPlataformas() { + return plataformas; + } + + public void setPlataformas(String plataformas) { + this.plataformas = plataformas; + } + + @Override + public String toString() { + return "Videogame [id=" + id + ", nombre=" + nombre + ", desarrollador=" + desarrollador + ", generos=" + + generos.toString() + ", fechaSalida=" + fechaSalida + ", plataformas=" + plataformas + "]"; + } + + +} diff --git a/src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryService.java b/src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryService.java new file mode 100644 index 0000000..4f083e9 --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryService.java @@ -0,0 +1,14 @@ +package com.daniminguet.videogameadvisor.service; + +import java.util.Collection; + +import com.daniminguet.videogameadvisor.model.Videogame; + +public interface VideogameQueryService { + public Collection exec(); + public VideogameQueryService anyGenre(String... genres); + public VideogameQueryService allGenres(String... genres); + public VideogameQueryService year(String year); + public VideogameQueryService betweenYears(String from, String to); + public VideogameQueryService titleContains(String title); +} diff --git a/src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.java b/src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.java new file mode 100644 index 0000000..3119a2e --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.java @@ -0,0 +1,81 @@ +package com.daniminguet.videogameadvisor.service; + +import java.time.LocalDate; +import java.util.Arrays; +import java.util.Collection; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.daniminguet.videogameadvisor.dao.VideogameDao; +import com.daniminguet.videogameadvisor.model.Videogame; + +@Service +public class VideogameQueryServiceImpl implements VideogameQueryService { + @Autowired + private VideogameDao dao; + + private Predicate predicate; + + @PostConstruct + public void init() { + predicate = null; + } + + @Override + public Collection exec() { + //@formatter:off + return dao.findAll() + .stream() + .filter(predicate) + .collect(Collectors.toList()); + //@formatter:on + } + + @Override + public VideogameQueryService anyGenre(String... genres) { + Predicate pAnyGenre = (vg -> Arrays.stream(genres).anyMatch(vg.getGeneros()::contains)); + predicate = (predicate == null) ? pAnyGenre : predicate.and(pAnyGenre); + return this; + } + + @Override + public VideogameQueryService allGenres(String... genres) { + Predicate pAllGenre = (vg -> Arrays.stream(genres).allMatch(vg.getGeneros()::contains)); + predicate = (predicate == null) ? pAllGenre : predicate.and(pAllGenre); + return this; + } + + @Override + public VideogameQueryService year(String year) { + Predicate pYear = (vg -> vg.getFechaSalida().substring(vg.getFechaSalida().length()-4, vg.getFechaSalida().length()-1).equalsIgnoreCase(year)); + predicate = (predicate == null) ? pYear : predicate.and(pYear); + return this; + } + + @Override + public VideogameQueryService betweenYears(String from, String to) { + Predicate pBetweenYears = (vg -> { + LocalDate fromYear = LocalDate.of(Integer.parseInt(from), 1, 1); + LocalDate toYear = LocalDate.of(Integer.parseInt(to), 1, 3); + LocalDate videogameYear = LocalDate.of(Integer.parseInt(vg.getFechaSalida().substring(vg.getFechaSalida().length()-4, vg.getFechaSalida().length()-1)), 1, 2); + + return videogameYear.isAfter(fromYear) && videogameYear.isBefore(toYear); + }); + + predicate = (predicate == null) ? pBetweenYears : predicate.and(pBetweenYears); + return this; + } + + @Override + public VideogameQueryService titleContains(String title) { + Predicate pTitleContains = (vg -> vg.getNombre().toLowerCase().contains(title.toLowerCase())); + predicate = (predicate == null) ? pTitleContains : predicate.and(pTitleContains); + return this; + } + +} diff --git a/src/main/java/com/daniminguet/videogameadvisor/service/VideogameService.java b/src/main/java/com/daniminguet/videogameadvisor/service/VideogameService.java new file mode 100644 index 0000000..6802274 --- /dev/null +++ b/src/main/java/com/daniminguet/videogameadvisor/service/VideogameService.java @@ -0,0 +1,61 @@ +package com.daniminguet.videogameadvisor.service; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.daniminguet.videogameadvisor.dao.VideogameDao; +import com.daniminguet.videogameadvisor.model.Videogame; + +@Service +public class VideogameService { + @Autowired + VideogameDao videogameDao; + + @Autowired + VideogameQueryService queryService; + + public Collection findAllGenres() { + List result = null; + + // @formatter:off + result = videogameDao.findAll() + .stream() + .map(vg -> vg.getGeneros()) + .flatMap(list -> list.stream()) + .distinct() + .sorted() + .collect(Collectors.toList()); + + // @formatter:on + + return result; + } + + public Collection findByAnyGenre(String... genres) { + return queryService.anyGenre(genres).exec(); + } + + public Collection findByAllGenres(String... genres) { + return queryService.allGenres(genres).exec(); + } + + public Collection findByYear(String year) { + return queryService.year(year).exec(); + } + + public Collection findBetweenYears(String from, String to) { + return queryService.betweenYears(from, to).exec(); + } + + public Collection findByTitleContains(String title) { + return queryService.titleContains(title).exec(); + } + + public Collection findAll() { + return videogameDao.findAll(); + } +} diff --git a/src/main/resources/VIDEOJUEGOS.csv b/src/main/resources/VIDEOJUEGOS.csv new file mode 100644 index 0000000..bade0f7 --- /dev/null +++ b/src/main/resources/VIDEOJUEGOS.csv @@ -0,0 +1,11 @@ +ID,NOMBRE,DESARROLLADOR,GENERO,FECHA SALIDA,PLATAFORMAS DISPONIBLES +1,God of War: Ragnarok,Santa Monica Studio,Accion-Aventura-Lucha-Rol,09/11/2022,PS5 y PS4 +2,FIFA 23,Electronic Arts,Deportes-Simulacion,27/09/2022,PS5-Nintendo Switch-XBOX y PC +3,Minecraft,Mojang Studios,Supervivencia-Sandbox,17/05/2009,PS-XBOX-Nintendo, Moviles y PC +4,Grand Theft Auto V,Rockstar Games,Mundo abierto,17/09/2013,PS-XBOX y PC +5,CounterStrike: Global Offensive,Valve Corporation,De disparos tactico,21/08/2012,XBOX y PC +6,Elden Ring,FromSoftware,Aventura-Mundo abierto,25/02/2022,PS-XBOX y PC +7,Uncharted 4,Naughty Dog,Accion-Aventura,10/05/2016,PS y PC +8,Ghost of Tsushima,Sucker Punch Productions,Rol-Sigilo-Accion-Aventura-Lucha,17/07/2020,PS5 y PS4 +9,The Witcher 3,CD Projekt,Mundo abierto,19/05/2015,PS-NINTENDO-XBOX y PC +10,Assassins Creed: Origins,Ubisoft,Mundo abierto-Accion-Aventura-Sigilo,27/10/2017,PS-XBOX y PC diff --git a/src/main/resources/ayuda.txt b/src/main/resources/ayuda.txt new file mode 100644 index 0000000..cd3c33b --- /dev/null +++ b/src/main/resources/ayuda.txt @@ -0,0 +1,50 @@ +Sintaxis: java -jar videogameadvisor.jar [OPCIONES] + + -lg + Lista los diferentes géneros de videojuegos de la colección. + No se pueden utilizar más parámetros. + + -ag genero1,genero2,genero... + Lista aquellos videojuegos que pertenecen a al menos uno de los géneros + que se indican. El listado de géneros no puede incluir espacios. + + -tg genero1,genero2,genero... + Lista aquellos videojuegos que pertenecen a todos y cada uno de los + géneros que se indican. El listado de géneros no puede incluir espacios. + + -y año + Lista aquellos videojuegos que se estrenaron en el año indicado. + El año debe expresarse con 4 cifras. + + -b desde,hasta + Lista aquellos videojuegos que se estrenaron entre los años DESDE y HASTA. + Los años indicados están incluidos. Deben expresarse con 4 cifras. + + -t titulo + Lista aquellos videojuegos cuyo título contiene la cadena proporcionada. + Se ignorará el uso de mayúsculas/minúsculas en la comparación. + + -h + Muestra este mensaje de ayuda. + +EJEMPLOS DE USO + +java -jar videogameadvisor.jar -y 2018 -ag Accion,Rol +Muestra los videojuegos que han salido en el año 2018 y son de acción y/o de comedia. + +java -jar videogameadvisor.jar -t war +Muestra los videojuegos cuyo título contiene la palabra war. + +java -jar videogameadvisor.jar -td Accion,Aventura -b 2000,2010 -t auto +Muestra los videojuegos cuyo título contiene la palabra auto, pertenecen al +género de acción y aventura y fueron estrenados entre 2000 y 2010. + +java -jar videogameadvisor.jar -lg +Muestra un listado con todos los géneros. + + +LICENCIAS + +Los datos utilizados sobre videojuegos utilizados en este ejemplo son +reales y creados por mi mismo. Ten en cuenta +que solo puede ser usada con fines personales y no comerciales. \ No newline at end of file diff --git a/src/main/resources/videogameadvisor.properties b/src/main/resources/videogameadvisor.properties new file mode 100644 index 0000000..87c7f63 --- /dev/null +++ b/src/main/resources/videogameadvisor.properties @@ -0,0 +1,3 @@ +file.path=classpath:VIDEOJUEGOS.csv +file.csv.separator=, +file.csv.list_separator=- \ No newline at end of file diff --git a/target/classes/META-INF/MANIFEST.MF b/target/classes/META-INF/MANIFEST.MF new file mode 100644 index 0000000..df3a5e7 --- /dev/null +++ b/target/classes/META-INF/MANIFEST.MF @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +Built-By: Dani +Build-Jdk: 17.0.4 +Created-By: Maven Integration for Eclipse + diff --git a/target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.properties b/target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.properties new file mode 100644 index 0000000..b376251 --- /dev/null +++ b/target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.properties @@ -0,0 +1,7 @@ +#Generated by Maven Integration for Eclipse +#Sat Nov 19 18:57:02 CET 2022 +m2e.projectLocation=C\:\\Users\\Dani\\Documents\\workspace-spring-tool-suite-4-4.15.3.RELEASE\\PracticaSpringCore +m2e.projectName=PracticaSpringCore +groupId=com.daniminguet.springcore +artifactId=PracticaSpringCore +version=0.0.1-SNAPSHOT diff --git a/target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.xml b/target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.xml new file mode 100644 index 0000000..93a26dd --- /dev/null +++ b/target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.xml @@ -0,0 +1,22 @@ + + 4.0.0 + com.daniminguet.springcore + PracticaSpringCore + 0.0.1-SNAPSHOT + PracticaSpringCore + Practica Acceso a Datos con Spring Core + + + + org.springframework + spring-context + 6.0.0 + + + + javax.annotation + javax.annotation-api + 1.3.2 + + + \ No newline at end of file diff --git a/target/classes/VIDEOJUEGOS.csv b/target/classes/VIDEOJUEGOS.csv new file mode 100644 index 0000000..bade0f7 --- /dev/null +++ b/target/classes/VIDEOJUEGOS.csv @@ -0,0 +1,11 @@ +ID,NOMBRE,DESARROLLADOR,GENERO,FECHA SALIDA,PLATAFORMAS DISPONIBLES +1,God of War: Ragnarok,Santa Monica Studio,Accion-Aventura-Lucha-Rol,09/11/2022,PS5 y PS4 +2,FIFA 23,Electronic Arts,Deportes-Simulacion,27/09/2022,PS5-Nintendo Switch-XBOX y PC +3,Minecraft,Mojang Studios,Supervivencia-Sandbox,17/05/2009,PS-XBOX-Nintendo, Moviles y PC +4,Grand Theft Auto V,Rockstar Games,Mundo abierto,17/09/2013,PS-XBOX y PC +5,CounterStrike: Global Offensive,Valve Corporation,De disparos tactico,21/08/2012,XBOX y PC +6,Elden Ring,FromSoftware,Aventura-Mundo abierto,25/02/2022,PS-XBOX y PC +7,Uncharted 4,Naughty Dog,Accion-Aventura,10/05/2016,PS y PC +8,Ghost of Tsushima,Sucker Punch Productions,Rol-Sigilo-Accion-Aventura-Lucha,17/07/2020,PS5 y PS4 +9,The Witcher 3,CD Projekt,Mundo abierto,19/05/2015,PS-NINTENDO-XBOX y PC +10,Assassins Creed: Origins,Ubisoft,Mundo abierto-Accion-Aventura-Sigilo,27/10/2017,PS-XBOX y PC diff --git a/target/classes/ayuda.txt b/target/classes/ayuda.txt new file mode 100644 index 0000000..cd3c33b --- /dev/null +++ b/target/classes/ayuda.txt @@ -0,0 +1,50 @@ +Sintaxis: java -jar videogameadvisor.jar [OPCIONES] + + -lg + Lista los diferentes géneros de videojuegos de la colección. + No se pueden utilizar más parámetros. + + -ag genero1,genero2,genero... + Lista aquellos videojuegos que pertenecen a al menos uno de los géneros + que se indican. El listado de géneros no puede incluir espacios. + + -tg genero1,genero2,genero... + Lista aquellos videojuegos que pertenecen a todos y cada uno de los + géneros que se indican. El listado de géneros no puede incluir espacios. + + -y año + Lista aquellos videojuegos que se estrenaron en el año indicado. + El año debe expresarse con 4 cifras. + + -b desde,hasta + Lista aquellos videojuegos que se estrenaron entre los años DESDE y HASTA. + Los años indicados están incluidos. Deben expresarse con 4 cifras. + + -t titulo + Lista aquellos videojuegos cuyo título contiene la cadena proporcionada. + Se ignorará el uso de mayúsculas/minúsculas en la comparación. + + -h + Muestra este mensaje de ayuda. + +EJEMPLOS DE USO + +java -jar videogameadvisor.jar -y 2018 -ag Accion,Rol +Muestra los videojuegos que han salido en el año 2018 y son de acción y/o de comedia. + +java -jar videogameadvisor.jar -t war +Muestra los videojuegos cuyo título contiene la palabra war. + +java -jar videogameadvisor.jar -td Accion,Aventura -b 2000,2010 -t auto +Muestra los videojuegos cuyo título contiene la palabra auto, pertenecen al +género de acción y aventura y fueron estrenados entre 2000 y 2010. + +java -jar videogameadvisor.jar -lg +Muestra un listado con todos los géneros. + + +LICENCIAS + +Los datos utilizados sobre videojuegos utilizados en este ejemplo son +reales y creados por mi mismo. Ten en cuenta +que solo puede ser usada con fines personales y no comerciales. \ No newline at end of file diff --git a/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorApp.class b/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorApp.class new file mode 100644 index 0000000000000000000000000000000000000000..f24b65f1e761e7d5d488fecdadc8d8c35494860b GIT binary patch literal 1072 zcmbVLU279T6g`u#ZMV^U)W$}Qw$*ArYF42r5)ooR5Vi_N0>!7vX1h+^%#__t?BDXG zMMdeeKT5o_TTQKEsV_5g@64Wi&b?>9egE_oz$PpMDTYl)jja)vVl1RLaU*LgMy~Ss z*yW?C2vuMWekQs}qPw?eAj44H#bi8mgV%iMy9{MpIou!cKYxGHZ$C_&qtb!kfWlchT+lqt(3HkK+L|H1djVmXumF> z?kvH#_3*I@5=lQ6kfIaWomPV)i*`nPwt0xT5An50tG)*2us~}*c|iLGiso?<1vEty()Kv#Hz|C|3H4$2#r?s0e(pt#*`*RnnHvH@9`<1S(s+6qs!OceU

3uVP^ znM~kz^M4U1kBX-uFuT@EoayKdlNq9~B#Cv(8JiINT+V-2s(qz=VKdj@rAvE}t54vR zz{x09S=Lo<>yCQcYpEr->#CT>M*(I8F59#%v#wA6b;@%7VAD6U=S(cubY^>Lq+e0U zLd@c{K+x9iq47yys2wieLSJR9^fvV>KE~Mqp9q9`oeO=4Ih+$1bN1ERDxarTxFvj5 zYUp+W7X!?bdG40b?=|t{3#LFKmvEVnLm~nf3lam@0n)Gs@oHEMuy6>^lO*0%TqB#9 zuga3j0pbCO0yi%UORH5!vR}Bd!b<|8TE%sI9^f;9GdbsB%Z80(cAZTb>kHgq5w|Vh zHfamo8ZKgEOQq}j`<_lBT^|u~AE$m4xA0|v+X6F(qV;)&_zHIzDeA`-xL!mWNo){p zXh!M*?j9H&;*#3)oY%RDOh77yt0 okazrBHv=qJC_chtt_Sn`1^0fY)o^}uBl0U@HMe@QpW%1Fzt=o)sQ>@~ literal 0 HcmV?d00001 diff --git a/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.class b/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.class new file mode 100644 index 0000000000000000000000000000000000000000..1c311313096f2855adf82f356ca767da90e6a11d GIT binary patch literal 5537 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/daniminguet/videogameadvisor/dao/VideogameDao.class b/target/classes/com/daniminguet/videogameadvisor/dao/VideogameDao.class new file mode 100644 index 0000000000000000000000000000000000000000..89a5c3977722532b76505289a4379e944bc94499 GIT binary patch literal 473 zcmb7B%}T>S7@VzX($>G$laG*GTm*Yk1gjL3fQLfwYjzD^+3Z5P3HWLrd;lLx{1Ozs zi1f7Ve6uq<^Syt(z5%$vNrHjEdEqOmm7|JW*_a?((#DsnGD^3!^)(N@Tz`Xi$|r~f zrW@5NX_YJGi2qYIpZ*mX677P0d;6>FxsAS|Bo-_<791OyK`TTm-|Dm2c|8 zEXgu9`(5T)7cv$Q*yE)DL+*Bn7+uE+MvRXc9bm%ueH`@o;n#VDW1jIYddBP%jrWIj literal 0 HcmV?d00001 diff --git a/target/classes/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.class b/target/classes/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.class new file mode 100644 index 0000000000000000000000000000000000000000..a40a61b681e9a6c3a18a1a98001e25acb243ab94 GIT binary patch literal 3872 zcmbVPTXz%J8Qn*cHAW2B7;G1eZ3qNp8!`j}g~&JiZ?{dcf z{o>*&{q&HcuITuvb z^Op@|1Uj$FC22X*U9hI-uB&orAS>|beY+LNHJ}5!Ek%Coq3u{DI|vH`n`Z0w2LKZO>&4Crh5cUYVbg zNb(ctDtTq;%u3(Z&&gsYyk?W|>5V10cQuf8Mw1rU6D8+nYiyUiAf(Vi=-10(K{MQA zVl&Jf9>RVD`@TuV+^xQehjBo_SWw|PTZgtIKNOcmRE;yC*1ez+@+O9~sY%lrRg=D? z_IhK)#38-W$qlVv%jP3EV!#p@-LSB&YAcQ&a>aOWan&Ov+P+D)O1Z#ln(1<3MB(i zu~VAVR(DNYz(un1{3o4&6?dRDoALN7wANs5ztpb-6826 zExN9fV&nC!ZR+LPYGa>Y$Nm9lrJ=POcN`9vHOdt|$KlwgdL&Z1$JPU4W^Ff6KI1-~ zzyI*=}+1D7TYu-8@(QPR( zvhL*?a9AiWWCK{2Rm}@*eaW&eJI{Jv$hjbE7gTu7s{}c`fnOVVQ{bVf&7&*Bc9*>|U=0NVq;`L5EuM72$CSJkMx$uVvY`d$S_%rX?N!L|=(UC!* z0t0^$c=#(quP2v*cLfH%-jr1wYm2=koaUzuDSq>nhu@ocBc+hzhc6g>-oocBf4A~i zzj^Qlir?G#bT&E*bPnG^*YLlw-$`!pv6@kWt%3W;ZhNtmRmb*M$*=Z&_^ieuF#`qpX52viwDu(WDK=&qT$x<&3oo+(+ zaAfKmC4v5gz-{zUOpm2cWIl+>t+zX~f}1I@5~#-DTer}j8T$a)S2Lpj7PfU~G`AJ} zSm1A8e%k*o+Pir$llnW|#54~?xjsdp$LV~O-E|rR7$eOmnA|fsz_pW1qozI_MP6)B zFDBGe7{^O^nI7ACQU{TVg4lxW=ll;v>`HBGKO;JGdgvsvOwdGUvEvYF50JK@d8M1Y z;_}kfyxNT&_yvn0&J1V4mNUGq@G7@c_+_Itf5qq5k|Vz(!te1XyoI;9qUYW__$zK< G=l=n%{oQQ< literal 0 HcmV?d00001 diff --git a/target/classes/com/daniminguet/videogameadvisor/model/Videogame.class b/target/classes/com/daniminguet/videogameadvisor/model/Videogame.class new file mode 100644 index 0000000000000000000000000000000000000000..59da53ed6b3649d7646ae4739c33ce82cd3b7134 GIT binary patch literal 2712 zcmbVMYfsx|6n-3XBMp}YN(a3pKq0{e(y^}H%B36apoNUm!5Ce)4~Dp@t0YFoLE2x~ zf0?vNgi5QlAFv-)?K!V=!*Qlsif7iT?c^(V(Jbc=n(7$B8iwB*XGXqkR7?5iM{mtzS3}4uYS6Yc zM5}h?$T2mf3T>-B*CGD0hJm7aYB-KvE*nML(GV+{RnxIgiRqcwT&tWfSf?(H`}eF; z)o^QqcH8%Pr5k;Xzg&539=|d6jIvcUcsnT@uJPJ-Dh547SFEb#u4(AY%^he6KW1bJ z^kFoKVSJ=vs9;siom%C{boPy-vI@aIHp&NvW68at47+bEqAeBvYwAev$J|yo?_QdA zDtcL{3N&&nA)Wj$_`p>DJD2^?a3hHbq9WZ&B8Ip~nI!r>X)1{Xu88h-5`&&@Hi;p` zHH;N5rT6EPW{M*v(|yK%VxibkkyGy$&TUDM{rtGo=&{knAo=5Ib#f>xW&7ELw1wJW1xwo4h9PYns8x1dHEtlCJzDeKn;LW$)dd2MvI`XJFS zD`>IX+5Td2NfCE#uXkeLP+ap*>w3*97fmOQFX^r||Cv`-aW#QetjpBoMS7CN*Vy2E z87C)Zm1VoZLUkp*0k<5-Qx<4GEzbmt=d`FdX z0ArMso&m1mW8UQFae{jA6AI)#DG78|K=gDS*Y$-uZtCOVI@0=hq>f2_JX*)JJ|3%M zM%?s4+)OnXg~_L%P=gr3D4z*_&CvNQoeG7gjFIpS3L;7D!aJ*?myBd({t;G^WFVp> ziCwakmHDS_ma-R6mRn+gRvL1c5hXtLdpUa9Vr*n=L#yxD4ZQB-x2Q2jhGXVZR)4+ANF5uCGWf6mrO?NJYE z(&|FwVIYwiKaur7BFn)<)XaLr;N@t8L^gX6kx3IG+<<&bNB+XWkZC=9kJXo{NAK{J z4A=!8r#3I}jPgw$se&h`Mc(n`$qVet^;_>cE%Lr6&xm}$*98vSu??yb+@|LO_Oaa& O<6&!oy(E(me)t(C literal 0 HcmV?d00001 diff --git a/target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryService.class b/target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryService.class new file mode 100644 index 0000000000000000000000000000000000000000..06d2978a6fd35c92f4298fc2a9732280ad2c3c80 GIT binary patch literal 686 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 #FWDU;cAsyu9# zy@Y2Nj9;lw*>E^&O5ob!PY<;&%L3KCQSD+urJPgIg=ja%a6!S73@2Jv%7Xny#YK!$ zitvibml_+fJT;UOW4NSZQr2j@xFs@_P5GdytZm?9YI8v>=9-U`a7D$l5^fitqcTMO zbC(6T83uwJ3wM~N;kvr$!%K>m1k6>WLAJJ+J$MrhH7?V&vj2NU5;mI3!}E)9XM`}N zbEta{HBevA+SFggWw0;VgSv_vn4)_&U1Lgakyw`P+xDDo(FGB4Y4BL8X{?# zF4s**M!Bfsri}7RH@ri)h4;;ns%e+ima!zKP_Y`kkk0bH{R|`Vd+#IR_)L0vI=E!uO;o!Z4ty+6PcH?<%JQ22~_Gaux z5<98z4DZ5qPN3-c|4p!_I0g>gKdHCA5?mE;`7ASyIJ&c%PxWP$e<^8_wu}(-(e*n^{9ReJRVD zDiss;6&s?|FisHY@bSfO`YIRZ4Ser)oj`Ju`trE$ip1(pyhW2q*d%|LpNm-do{!&fATArr-w}S{6P^ z7n1K_>>x00H1tL2M^h<%DYTOB74(L@f9KKUH_hhsTuJ*Hy&1hb2L8aRUuh9RjGj^e zunKGFDUV9wJy=U`8d9;2POYbP1RFddKhsJA7-Fe`->`8On;B-Yjo~hKfmZzyT4{2% zKSGZ~a`$0|KXGgpk4Eq}lBvO8h`-I#JwT8_@*~(pKsOVum!4bDhpp(R$$1~P;TY{5 zr@2_-lP5`cfGZg#O(tbH@39&1bjHBe}xg-VE?H!yUN;_WjQt$OjCBH%6Z_-aD`Um9kkMJoz^H!hZ SD}0S_Xirx4xA-1EV$=U