commit dfdaf6ded9da615ed62352df458b3650cc8387bb Author: Dani Minguet Date: Sat Nov 19 20:39:37 2022 +0100 Trabajo Spring Core - Videojuegos 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 0000000..8e15485 Binary files /dev/null and b/DiagramaVideoGameAdvisor.PNG differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..d703b65 --- /dev/null +++ b/README.md @@ -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. +``` + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..93a26dd --- /dev/null +++ b/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/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 0000000..f24b65f Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorApp.class differ diff --git a/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.class b/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.class new file mode 100644 index 0000000..007ebed Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorHelp.class differ diff --git a/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.class b/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.class new file mode 100644 index 0000000..1c31131 Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/VideogameAdvisorRunApp.class differ diff --git a/target/classes/com/daniminguet/videogameadvisor/config/AppConfig.class b/target/classes/com/daniminguet/videogameadvisor/config/AppConfig.class new file mode 100644 index 0000000..f1cd2dc Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/config/AppConfig.class differ diff --git a/target/classes/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.class b/target/classes/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.class new file mode 100644 index 0000000..18e15e4 Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/dao/UtilVideogameFileReader.class differ 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 0000000..89a5c39 Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/dao/VideogameDao.class differ 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 0000000..a40a61b Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/dao/VideogameDaoImplMemory.class differ 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 0000000..59da53e Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/model/Videogame.class differ 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 0000000..06d2978 Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryService.class differ diff --git a/target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.class b/target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.class new file mode 100644 index 0000000..7781d82 Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/service/VideogameQueryServiceImpl.class differ diff --git a/target/classes/com/daniminguet/videogameadvisor/service/VideogameService.class b/target/classes/com/daniminguet/videogameadvisor/service/VideogameService.class new file mode 100644 index 0000000..d9a6695 Binary files /dev/null and b/target/classes/com/daniminguet/videogameadvisor/service/VideogameService.class differ diff --git a/target/classes/videogameadvisor.properties b/target/classes/videogameadvisor.properties new file mode 100644 index 0000000..87c7f63 --- /dev/null +++ b/target/classes/videogameadvisor.properties @@ -0,0 +1,3 @@ +file.path=classpath:VIDEOJUEGOS.csv +file.csv.separator=, +file.csv.list_separator=- \ No newline at end of file