@ -0,0 +1,20 @@ | |||||
# Título | |||||
Creación de una aplicación de búsqueda de libros con Spring Core. | |||||
## Uso | |||||
Para la creación de este proyecto hemos usado la tecnología de Spring Core para agilizar las relaciones entre los objetos. | |||||
En esta app podrás realizar consultas como buscar un libro por género o por título, además se ha añadido un apartado de [ayuda](./src/main/resources/help.txt/) que muestra de forma clara el uso. | |||||
## Ejemplo: Buscar un luchador por categoria. | |||||
``` | |||||
java -jar playersearch.jar -t welter | |||||
``` | |||||
``` | |||||
ID Nombre Categoria MejorDisciplina Victorias Derrotas | |||||
6 Eddie Alvaréz Peso Welter UFC 30 7 | |||||
7 Israel Adesanya Peso Welter MMA 20 1 | |||||
``` | |||||
## Diagrama de clases | |||||
![Diagrama de clases.](./img/diagramaClases_booksearch.png "Diagrama de clases.") |
@ -0,0 +1,21 @@ | |||||
package mmaplayers.playersearch; | |||||
import mmaplayers.playersearch.config.AppConfig; | |||||
import org.springframework.context.ApplicationContext; | |||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext; | |||||
public class App { | |||||
public static void main(String[] args) { | |||||
ApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class); | |||||
Run runApp = appContext.getBean(Run.class); | |||||
runApp.run(args); | |||||
((AnnotationConfigApplicationContext) appContext).close(); | |||||
} | |||||
} |
@ -0,0 +1,32 @@ | |||||
package mmaplayers.playersearch; | |||||
import org.springframework.stereotype.Component; | |||||
import org.springframework.util.ResourceUtils; | |||||
import javax.annotation.PostConstruct; | |||||
import java.io.IOException; | |||||
import java.nio.file.Files; | |||||
import java.nio.file.Paths; | |||||
import java.util.stream.Collectors; | |||||
@Component | |||||
public class Help { | |||||
private String help; | |||||
@PostConstruct | |||||
public void init() { | |||||
try { | |||||
help = Files | |||||
.lines(Paths.get(ResourceUtils.getFile("classpath:help.txt").toURI())) | |||||
.collect(Collectors.joining("\n")); | |||||
} catch (IOException e) { | |||||
System.err.println("Error cargando el texto de ayuda"); | |||||
System.exit(-1); | |||||
} | |||||
} | |||||
public String getHelp() { | |||||
return help; | |||||
} | |||||
} |
@ -0,0 +1,88 @@ | |||||
package mmaplayers.playersearch; | |||||
import mmaplayers.playersearch.model.Fighter; | |||||
import mmaplayers.playersearch.service.IFightQueryService; | |||||
import mmaplayers.playersearch.service.IFightService; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.ArrayList; | |||||
import java.util.Collection; | |||||
import java.util.List; | |||||
@Component | |||||
public class Run { | |||||
@Autowired | |||||
IFightService iFightService; | |||||
@Autowired | |||||
IFightQueryService iFightQueryService; | |||||
@Autowired | |||||
Help 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": | |||||
iBookService.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 { | |||||
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": | |||||
iBookQueryService.anyGenre(argumento[1].split(",")); | |||||
break; | |||||
case "-tg": | |||||
iBookQueryService.allGenres(argumento[1].split(",")); | |||||
break; | |||||
case "-t": | |||||
iBookQueryService.anyTitle(argumento[1]); | |||||
break; | |||||
default: | |||||
error = true; | |||||
System.out.println("Error de sintaxis"); | |||||
System.out.println(help.getHelp()); | |||||
} | |||||
} | |||||
if (!error) { | |||||
Collection<Book> result = iBookQueryService.exec(); | |||||
System.out.printf("%s\t%-35s\t%-22s\t%s\n", "ID", "Título", "Autor", "Género"); | |||||
if (result != null) { | |||||
result.forEach(book -> System.out.printf("%s\t%-35s\t%-22s\t%s\n", | |||||
book.getId(), book.getName(), book.getAuthors(), | |||||
book.getGenre())); | |||||
} else { | |||||
System.out.println("No hay libros que cumplan esos criterios."); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,14 @@ | |||||
package mmaplayers.fightersearch.service; | |||||
import mmaplayers.fightersearch.model.Fighter; | |||||
import java.util.Collection; | |||||
import java.util.Collection; | |||||
public interface IBookQueryService { | |||||
public Collection<Book> exec(); | |||||
public IBookQueryService anyCategorie(String... categorie); | |||||
public IBookQueryService allCategories(String... categories); | |||||
public IBookQueryService anyName(String name); | |||||
} |
@ -0,0 +1,11 @@ | |||||
Id;Nombre;Categoria;Mejor Disciplina;Victorias;Derrotas | |||||
1;Valentina Shevchenko;Peso Pluma;MMA;20;3 | |||||
2;Antonio Nogueira;Peso Pesado;UFC;34;12 | |||||
3;Alistair Overeem;Peso Pesado;K1;47;19 | |||||
4;Robbie Lawler;Peso Pesado;MMA;28;15 | |||||
5;Matt Hughes;Peso Pesado;FCF;45;9 | |||||
6;Eddie Alvaréz;Peso Welter;UFC;30;7 | |||||
7;Israel Adesanya;Peso Welter;MMA;20;1 | |||||
8;Henry Cejudo;Peso Mosca;UFC;16;2 | |||||
9;Quinton Jackson ;Peso Semipesado;UFC;38;14 | |||||
10;Randy Couture;Peso Ligero;MMA;21;9 |
@ -0,0 +1,32 @@ | |||||
Sintaxis: java -jar booksearch.jar [OPCIONES] | |||||
-lg | |||||
Lista las diferentes categorias de luchadores del documento. | |||||
No se pueden utilizar más parámetros. | |||||
-ag categoria1,categoria2,categoria... | |||||
Lista aquellos luchadores que pertenecen a al menos una de los categorias | |||||
que se indican. El listado de categorias no puede incluir espacios. | |||||
-tg categoria1,categoria2,categoria... | |||||
Lista aquellas categorias que pertenecen a todos y cada uno de los | |||||
luchadores que se indican. El listado de categorias no puede incluir espacios. | |||||
-t nombre | |||||
Lista aquellos luchadores cuyo nombre contiene la cadena proporcionada. | |||||
Se ignorará el uso de mayúsculas/minúsculas en la comparación. | |||||
-h | |||||
Muestra este mensaje de ayuda. | |||||
EJEMPLO DE USO | |||||
java -jar playersearch.jar -t shev | |||||
Muestra los luvhadores cuyo nombre contiene la palabra shev. | |||||
java -jar playersearch.jar -td Peso Pluma | |||||
Muestra los luchadores que pertenecen a la categoria peso pluma | |||||
java -jar playersearch.jar -lg | |||||
Muestra un listado con todos las categorias. |
@ -0,0 +1,3 @@ | |||||
file.path=classpath:MMA_DanielKuperus.csv | |||||
file.csv.separator=; | |||||
file.csv.list_separator=, |
@ -1,13 +0,0 @@ | |||||
package mmaplayers.fightersearch.service; | |||||
import mmaplayers.fightersearch.model.Fighter; | |||||
import java.util.Collection; | |||||
public interface IFightQueryService { | |||||
public Collection<String> findAllCategories(); | |||||
public Collection<Fighter> findByAnyCategorie(String... categories); | |||||
public Collection<Fighter> findByAllCategories(String... categories); | |||||
public Collection<Fighter> findByNameContains(String name); | |||||
public Collection<Fighter> findAll(); | |||||
} |
@ -0,0 +1,10 @@ | |||||
package mmaplayers.playersearch; | |||||
import org.junit.Test; | |||||
public class PlayerSearchAppTests { | |||||
@Test | |||||
void contextLoads() { | |||||
} | |||||
} |