Browse Source

Trabajo Spring Core - Videojuegos

master
Dani Minguet 2 years ago
commit
dfdaf6ded9
39 changed files with 896 additions and 0 deletions
  1. +51
    -0
      .classpath
  2. +23
    -0
      .project
  3. +2
    -0
      .settings/org.eclipse.jdt.apt.core.prefs
  4. +16
    -0
      .settings/org.eclipse.jdt.core.prefs
  5. +4
    -0
      .settings/org.eclipse.m2e.core.prefs
  6. BIN
      DiagramaVideoGameAdvisor.PNG
  7. +78
    -0
      README.md
  8. +22
    -0
      pom.xml
  9. +19
    -0
      src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorApp.java
  10. +33
    -0
      src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.java
  11. +96
    -0
      src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.java
  12. +32
    -0
      src/main/java/com/daniminguet/videogameadvisor/config/AppConfig.java
  13. +38
    -0
      src/main/java/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.java
  14. +13
    -0
      src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDao.java
  15. +71
    -0
      src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.java
  16. +80
    -0
      src/main/java/com/daniminguet/videogameadvisor/model/Videogame.java
  17. +14
    -0
      src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryService.java
  18. +81
    -0
      src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.java
  19. +61
    -0
      src/main/java/com/daniminguet/videogameadvisor/service/VideogameService.java
  20. +11
    -0
      src/main/resources/VIDEOJUEGOS.csv
  21. +50
    -0
      src/main/resources/ayuda.txt
  22. +3
    -0
      src/main/resources/videogameadvisor.properties
  23. +5
    -0
      target/classes/META-INF/MANIFEST.MF
  24. +7
    -0
      target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.properties
  25. +22
    -0
      target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.xml
  26. +11
    -0
      target/classes/VIDEOJUEGOS.csv
  27. +50
    -0
      target/classes/ayuda.txt
  28. BIN
      target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorApp.class
  29. BIN
      target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.class
  30. BIN
      target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.class
  31. BIN
      target/classes/com/daniminguet/videogameadvisor/config/AppConfig.class
  32. BIN
      target/classes/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.class
  33. BIN
      target/classes/com/daniminguet/videogameadvisor/dao/VideogameDao.class
  34. BIN
      target/classes/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.class
  35. BIN
      target/classes/com/daniminguet/videogameadvisor/model/Videogame.class
  36. BIN
      target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryService.class
  37. BIN
      target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.class
  38. BIN
      target/classes/com/daniminguet/videogameadvisor/service/VideogameService.class
  39. +3
    -0
      target/classes/videogameadvisor.properties

+ 51
- 0
.classpath View File

@ -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>

+ 23
- 0
.project View File

@ -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>

+ 2
- 0
.settings/org.eclipse.jdt.apt.core.prefs View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
org.eclipse.jdt.apt.aptEnabled=false

+ 16
- 0
.settings/org.eclipse.jdt.core.prefs View File

@ -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

+ 4
- 0
.settings/org.eclipse.m2e.core.prefs View File

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

BIN
DiagramaVideoGameAdvisor.PNG View File

Before After
Width: 1118  |  Height: 470  |  Size: 49 KiB

+ 78
- 0
README.md View File

@ -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.
```

+ 22
- 0
pom.xml View File

@ -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>

+ 19
- 0
src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorApp.java View File

@ -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();
}
}

+ 33
- 0
src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.java View File

@ -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;
}
}

+ 96
- 0
src/main/java/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.java View File

@ -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");
}
}
}
}
}

+ 32
- 0
src/main/java/com/daniminguet/videogameadvisor/config/AppConfig.java View File

@ -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;
}
}

+ 38
- 0
src/main/java/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.java View File

@ -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;
}
}

+ 13
- 0
src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDao.java View File

@ -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);
}

+ 71
- 0
src/main/java/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.java View File

@ -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;
}
}

+ 80
- 0
src/main/java/com/daniminguet/videogameadvisor/model/Videogame.java View File

@ -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 + "]";
}
}

+ 14
- 0
src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryService.java View File

@ -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);
}

+ 81
- 0
src/main/java/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.java View File

@ -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;
}
}

+ 61
- 0
src/main/java/com/daniminguet/videogameadvisor/service/VideogameService.java View File

@ -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();
}
}

+ 11
- 0
src/main/resources/VIDEOJUEGOS.csv View File

@ -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

+ 50
- 0
src/main/resources/ayuda.txt View File

@ -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.

+ 3
- 0
src/main/resources/videogameadvisor.properties View File

@ -0,0 +1,3 @@
file.path=classpath:VIDEOJUEGOS.csv
file.csv.separator=,
file.csv.list_separator=-

+ 5
- 0
target/classes/META-INF/MANIFEST.MF View File

@ -0,0 +1,5 @@
Manifest-Version: 1.0
Built-By: Dani
Build-Jdk: 17.0.4
Created-By: Maven Integration for Eclipse

+ 7
- 0
target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.properties View File

@ -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

+ 22
- 0
target/classes/META-INF/maven/com.daniminguet.springcore/PracticaSpringCore/pom.xml View File

@ -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>

+ 11
- 0
target/classes/VIDEOJUEGOS.csv View File

@ -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

+ 50
- 0
target/classes/ayuda.txt View File

@ -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.

BIN
target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorApp.class View File


BIN
target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.class View File


BIN
target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.class View File


BIN
target/classes/com/daniminguet/videogameadvisor/config/AppConfig.class View File


BIN
target/classes/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.class View File


BIN
target/classes/com/daniminguet/videogameadvisor/dao/VideogameDao.class View File


BIN
target/classes/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.class View File


BIN
target/classes/com/daniminguet/videogameadvisor/model/Videogame.class View File


BIN
target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryService.class View File


BIN
target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.class View File


BIN
target/classes/com/daniminguet/videogameadvisor/service/VideogameService.class View File


+ 3
- 0
target/classes/videogameadvisor.properties View File

@ -0,0 +1,3 @@
file.path=classpath:VIDEOJUEGOS.csv
file.csv.separator=,
file.csv.list_separator=-

Loading…
Cancel
Save