@ -0,0 +1,51 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<classpath> | |||
<classpathentry kind="src" output="target/classes" path="src/main/java"> | |||
<attributes> | |||
<attribute name="optional" value="true"/> | |||
<attribute name="maven.pomderived" value="true"/> | |||
</attributes> | |||
</classpathentry> | |||
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"> | |||
<attributes> | |||
<attribute name="maven.pomderived" value="true"/> | |||
</attributes> | |||
</classpathentry> | |||
<classpathentry kind="src" output="target/test-classes" path="src/test/java"> | |||
<attributes> | |||
<attribute name="optional" value="true"/> | |||
<attribute name="maven.pomderived" value="true"/> | |||
<attribute name="test" value="true"/> | |||
</attributes> | |||
</classpathentry> | |||
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"> | |||
<attributes> | |||
<attribute name="maven.pomderived" value="true"/> | |||
<attribute name="test" value="true"/> | |||
</attributes> | |||
</classpathentry> | |||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> | |||
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> | |||
<attributes> | |||
<attribute name="maven.pomderived" value="true"/> | |||
</attributes> | |||
</classpathentry> | |||
<classpathentry kind="src" path="target/generated-sources/annotations"> | |||
<attributes> | |||
<attribute name="optional" value="true"/> | |||
<attribute name="maven.pomderived" value="true"/> | |||
<attribute name="ignore_optional_problems" value="true"/> | |||
<attribute name="m2e-apt" value="true"/> | |||
</attributes> | |||
</classpathentry> | |||
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations"> | |||
<attributes> | |||
<attribute name="optional" value="true"/> | |||
<attribute name="maven.pomderived" value="true"/> | |||
<attribute name="ignore_optional_problems" value="true"/> | |||
<attribute name="m2e-apt" value="true"/> | |||
<attribute name="test" value="true"/> | |||
</attributes> | |||
</classpathentry> | |||
<classpathentry kind="output" path="target/classes"/> | |||
</classpath> |
@ -0,0 +1,23 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<projectDescription> | |||
<name>PracticaSpringCore</name> | |||
<comment></comment> | |||
<projects> | |||
</projects> | |||
<buildSpec> | |||
<buildCommand> | |||
<name>org.eclipse.jdt.core.javabuilder</name> | |||
<arguments> | |||
</arguments> | |||
</buildCommand> | |||
<buildCommand> | |||
<name>org.eclipse.m2e.core.maven2Builder</name> | |||
<arguments> | |||
</arguments> | |||
</buildCommand> | |||
</buildSpec> | |||
<natures> | |||
<nature>org.eclipse.jdt.core.javanature</nature> | |||
<nature>org.eclipse.m2e.core.maven2Nature</nature> | |||
</natures> | |||
</projectDescription> |
@ -0,0 +1,2 @@ | |||
eclipse.preferences.version=1 | |||
org.eclipse.jdt.apt.aptEnabled=false |
@ -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 |
@ -0,0 +1,4 @@ | |||
activeProfiles= | |||
eclipse.preferences.version=1 | |||
resolveWorkspaceProjects=true | |||
version=1 |
@ -0,0 +1,78 @@ | |||
# TRABAJO SPRING CORE - DANI MINGUET | |||
He realizado el trabajo sobre videojuegos, aquí muestro el diagrama de clases empleado (Atributos sin "Bold", métodos en "Bold"): | |||
![Image](DiagramaVideoGameAdvisor.PNG) | |||
Aquí muestro el fichero csv que utilizo: | |||
``` | |||
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 | |||
``` | |||
Al iniciar el programa, si no hay parámetros definidos te debería mostrar una alerta de que no se han indicado, y mostrará el contenido del fichero de ayuda, para saber que parámetros puedes utilizar: | |||
``` | |||
No se ha pasado ningún parámetro | |||
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. | |||
``` | |||
@ -0,0 +1,22 @@ | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<groupId>com.daniminguet.springcore</groupId> | |||
<artifactId>PracticaSpringCore</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<name>PracticaSpringCore</name> | |||
<description>Practica Acceso a Datos con Spring Core</description> | |||
<dependencies> | |||
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> | |||
<dependency> | |||
<groupId>org.springframework</groupId> | |||
<artifactId>spring-context</artifactId> | |||
<version>6.0.0</version> | |||
</dependency> | |||
<!--https://www.baeldung.com/spring-postconstruct-predestroy --> | |||
<dependency> | |||
<groupId>javax.annotation</groupId> | |||
<artifactId>javax.annotation-api</artifactId> | |||
<version>1.3.2</version> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@ -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(); | |||
} | |||
} |
@ -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; | |||
} | |||
} |
@ -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<String[]> 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<Videogame> 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"); | |||
} | |||
} | |||
} | |||
} | |||
} |
@ -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; | |||
} | |||
} |
@ -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<Videogame> readFile(final String path, final String separator, final String listSeparator) { | |||
List<Videogame> result = new ArrayList<Videogame>(); | |||
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; | |||
} | |||
} |
@ -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<Videogame> findAll(); | |||
public void insert(Videogame videogame); | |||
public void edit(Videogame videogame); | |||
public void delete(long id); | |||
} |
@ -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<Videogame> videogames = new ArrayList<Videogame>(); | |||
@Autowired | |||
private AppConfig appConfig; | |||
@PostConstruct | |||
public void init() { | |||
videogames = UtilVideogameFileReader.readFile(appConfig.getFile(), appConfig.getSeparator(), appConfig.getListSeparator()); | |||
} | |||
public Videogame findById(long id) { | |||
Optional<Videogame> result = videogames.stream().filter(vg -> vg.getId() == id).findFirst(); | |||
return result.orElse(null); | |||
} | |||
public Collection<Videogame> 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; | |||
} | |||
} |
@ -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<String> generos; | |||
private String fechaSalida; | |||
private String plataformas; | |||
public Videogame() {} | |||
public Videogame(long id, String nombre, String desarrollador, List<String> 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<String> getGeneros() { | |||
return generos; | |||
} | |||
public void setGeneros(List<String> 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 + "]"; | |||
} | |||
} |
@ -0,0 +1,14 @@ | |||
package com.daniminguet.videogameadvisor.service; | |||
import java.util.Collection; | |||
import com.daniminguet.videogameadvisor.model.Videogame; | |||
public interface VideogameQueryService { | |||
public Collection<Videogame> 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); | |||
} |
@ -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<Videogame> predicate; | |||
@PostConstruct | |||
public void init() { | |||
predicate = null; | |||
} | |||
@Override | |||
public Collection<Videogame> exec() { | |||
//@formatter:off | |||
return dao.findAll() | |||
.stream() | |||
.filter(predicate) | |||
.collect(Collectors.toList()); | |||
//@formatter:on | |||
} | |||
@Override | |||
public VideogameQueryService anyGenre(String... genres) { | |||
Predicate<Videogame> 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<Videogame> 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<Videogame> 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<Videogame> 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<Videogame> pTitleContains = (vg -> vg.getNombre().toLowerCase().contains(title.toLowerCase())); | |||
predicate = (predicate == null) ? pTitleContains : predicate.and(pTitleContains); | |||
return this; | |||
} | |||
} |
@ -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<String> findAllGenres() { | |||
List<String> 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<Videogame> findByAnyGenre(String... genres) { | |||
return queryService.anyGenre(genres).exec(); | |||
} | |||
public Collection<Videogame> findByAllGenres(String... genres) { | |||
return queryService.allGenres(genres).exec(); | |||
} | |||
public Collection<Videogame> findByYear(String year) { | |||
return queryService.year(year).exec(); | |||
} | |||
public Collection<Videogame> findBetweenYears(String from, String to) { | |||
return queryService.betweenYears(from, to).exec(); | |||
} | |||
public Collection<Videogame> findByTitleContains(String title) { | |||
return queryService.titleContains(title).exec(); | |||
} | |||
public Collection<Videogame> findAll() { | |||
return videogameDao.findAll(); | |||
} | |||
} |
@ -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 |
@ -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. |
@ -0,0 +1,3 @@ | |||
file.path=classpath:VIDEOJUEGOS.csv | |||
file.csv.separator=, | |||
file.csv.list_separator=- |
@ -0,0 +1,5 @@ | |||
Manifest-Version: 1.0 | |||
Built-By: Dani | |||
Build-Jdk: 17.0.4 | |||
Created-By: Maven Integration for Eclipse | |||
@ -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 |
@ -0,0 +1,22 @@ | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<groupId>com.daniminguet.springcore</groupId> | |||
<artifactId>PracticaSpringCore</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<name>PracticaSpringCore</name> | |||
<description>Practica Acceso a Datos con Spring Core</description> | |||
<dependencies> | |||
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> | |||
<dependency> | |||
<groupId>org.springframework</groupId> | |||
<artifactId>spring-context</artifactId> | |||
<version>6.0.0</version> | |||
</dependency> | |||
<!--https://www.baeldung.com/spring-postconstruct-predestroy --> | |||
<dependency> | |||
<groupId>javax.annotation</groupId> | |||
<artifactId>javax.annotation-api</artifactId> | |||
<version>1.3.2</version> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@ -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 |
@ -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. |
@ -0,0 +1,3 @@ | |||
file.path=classpath:VIDEOJUEGOS.csv | |||
file.csv.separator=, | |||
file.csv.list_separator=- |