├── .gitignore ├── README.md ├── Regex └── davechild_regular-expressions.pdf ├── Soluciones ├── 01-FicherosTexto │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── description.html │ │ ├── encodings.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── project-template.xml │ │ ├── uiDesigner.xml │ │ └── vcs.xml │ ├── 03-FicherosTexto.iml │ └── src │ │ └── es │ │ └── joseluisgs │ │ └── dam │ │ ├── FicherosTexto.java │ │ ├── Main.java │ │ ├── controllers │ │ └── PersonaController.java │ │ └── model │ │ └── Persona.java ├── 02-FicherosBinarios │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── description.html │ │ ├── encodings.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── project-template.xml │ │ ├── uiDesigner.xml │ │ └── vcs.xml │ ├── 04-FicherosBinarios.iml │ └── src │ │ └── es │ │ └── joseluisgs │ │ └── dam │ │ ├── FicherosBinarios.java │ │ ├── Main.java │ │ ├── controllers │ │ └── PersonaController.java │ │ ├── model │ │ ├── Empleado.java │ │ └── Persona.java │ │ └── utils │ │ └── Formatter.java ├── 03-FicherosAccesoAleatorio │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── description.html │ │ ├── encodings.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── project-template.xml │ │ └── vcs.xml │ ├── 05-FicherosAccesoAleatorio.iml │ └── src │ │ └── es │ │ └── joseluisgs │ │ └── dam │ │ ├── EjemplosVarios.java │ │ └── Main.java ├── 04-FicherosDirectorios │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── description.html │ │ ├── encodings.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── project-template.xml │ │ ├── runConfigurations.xml │ │ └── vcs.xml │ ├── 06-FicherosDirectorios.iml │ └── src │ │ └── es │ │ └── joseluisgs │ │ └── dam │ │ └── Main.java ├── 06-FicherosUtils │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── description.html │ │ ├── encodings.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── project-template.xml │ │ ├── runConfigurations.xml │ │ └── vcs.xml │ ├── 08-FicherosUtils.iml │ └── src │ │ └── es │ │ └── joseluisgs │ │ └── dam │ │ └── Main.java ├── 07-Json-Gson │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── compiler.xml │ │ ├── description.html │ │ ├── encodings.xml │ │ ├── jarRepositories.xml │ │ ├── libraries │ │ │ ├── Maven__com_google_code_gson_gson_2_9_0.xml │ │ │ └── Maven__org_projectlombok_lombok_1_18_22.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ └── project-template.xml │ ├── Json-Gson.iml │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── es │ │ └── joseluisgs │ │ └── dam │ │ ├── Main.java │ │ └── model │ │ ├── Menu.java │ │ └── Producto.java ├── 08-ExpresionesRegulares │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── description.html │ │ ├── encodings.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── project-template.xml │ │ ├── runConfigurations.xml │ │ └── vcs.xml │ ├── 11-ExpresionesRegulares.iml │ └── src │ │ └── es │ │ └── joseluisgs │ │ └── dam │ │ ├── ExrpesionesRegulares.java │ │ └── Main.java ├── 09-StringPattern │ ├── .idea │ │ ├── .gitignore │ │ ├── description.html │ │ ├── encodings.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ └── project-template.xml │ ├── StringPattern.iml │ └── src │ │ └── es │ │ └── joseluisgs │ │ └── dam │ │ └── Main.java ├── 10-MVC-Paises-FicherosTexto │ ├── .gitignore │ ├── SecuenciaPaises.iml │ ├── data │ │ └── paises.txt │ └── src │ │ └── es │ │ └── joseluisgs │ │ └── dam │ │ ├── Main.java │ │ ├── comparators │ │ ├── PaisCodigoComparator.java │ │ └── PaisNombreComparator.java │ │ ├── controllers │ │ ├── AcuerdoController.java │ │ └── PaisController.java │ │ ├── exceptions │ │ └── PaisException.java │ │ ├── models │ │ ├── Acuerdo.java │ │ ├── LineaAcuerdo.java │ │ └── Pais.java │ │ ├── repositories │ │ ├── AcuerdoRepository.java │ │ ├── CRUDRepository.java │ │ ├── IAcuerdoRepository.java │ │ ├── IPaisRepository.java │ │ └── PaisRepository.java │ │ ├── services │ │ ├── IStorage.java │ │ ├── IStoragePaises.java │ │ └── StoragePaisesCSVFile.java │ │ ├── utils │ │ ├── Console.java │ │ └── Formatter.java │ │ └── views │ │ └── PaisView.java ├── 12-MVC-Paises-FicherosJson │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── compiler.xml │ │ ├── description.html │ │ ├── encodings.xml │ │ ├── jarRepositories.xml │ │ ├── libraries │ │ │ └── Maven__com_google_code_gson_gson_2_9_0.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── project-template.xml │ │ └── uiDesigner.xml │ ├── SecuenciaPaises.iml │ ├── data │ │ └── paises.json │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── es │ │ └── joseluisgs │ │ └── dam │ │ ├── Main.java │ │ ├── comparators │ │ ├── PaisCodigoComparator.java │ │ └── PaisNombreComparator.java │ │ ├── controllers │ │ ├── AcuerdoController.java │ │ └── PaisController.java │ │ ├── exceptions │ │ └── PaisException.java │ │ ├── models │ │ ├── Acuerdo.java │ │ ├── LineaAcuerdo.java │ │ └── Pais.java │ │ ├── repositories │ │ ├── AcuerdoRepository.java │ │ ├── CRUDRepository.java │ │ ├── IAcuerdoRepository.java │ │ ├── IPaisRepository.java │ │ └── PaisRepository.java │ │ ├── services │ │ ├── IStorage.java │ │ ├── IStoragePaises.java │ │ └── StoragePaisesJsonFile.java │ │ ├── utils │ │ ├── Console.java │ │ └── Formatter.java │ │ └── views │ │ └── PaisView.java └── 13-Pokedex │ ├── .idea │ ├── .gitignore │ ├── compiler.xml │ ├── description.html │ ├── encodings.xml │ ├── jarRepositories.xml │ ├── libraries │ │ └── Maven__com_google_code_gson_gson_2_9_0.xml │ ├── misc.xml │ ├── modules.xml │ └── project-template.xml │ ├── Pokedex.iml │ ├── data │ └── pokemon.json │ ├── pom.xml │ └── src │ └── main │ └── java │ └── es │ └── joseluisgs │ └── dam │ ├── Main.java │ ├── controllers │ └── PokemonController.java │ └── models │ ├── NextEvolution.java │ ├── Pokedex.java │ ├── Pokemon.java │ └── PrevEvolution.java └── UD08.pdf /.gitignore: -------------------------------------------------------------------------------- 1 | *.pptx 2 | .DS_Store 3 | /Ejercicios/*.docx 4 | upload.sh 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Programación - 08 Lectura y Escritura de Información Externa. Ficheros 2 | 3 | Tema 08 Lectura y Escritura de Información Externa. Ficheros. 1DAM. Curso 2021/2022. 4 | 5 | ![imagen](https://www.mindinventory.com/blog/wp-content/uploads/2019/10/Offshore-app-developer.png) 6 | 7 | ## Contenidos 8 | 1. Ficheros y Directorios. 9 | 2. Java Nio2. 10 | 3. Expresiones regulares. 11 | 4. JSON. 12 | 5. Localización. 13 | 14 | 15 | ## Recursos 16 | - Twitter: https://twitter.com/joseluisgonsan 17 | - GitHub: https://github.com/joseluisgs 18 | - Web: https://joseluisgs.github.io 19 | - Discord: https://discord.gg/uv7GcytM 20 | - Aula Virtual: https://aulavirtual33.educa.madrid.org/ies.luisvives.leganes/course/view.php?id=245 21 | 22 | 23 | 24 | ## Autor 25 | 26 | Codificado con :sparkling_heart: por [José Luis González Sánchez](https://twitter.com/joseluisgonsan) 27 | 28 | [![Twitter](https://img.shields.io/twitter/follow/joseluisgonsan?style=social)](https://twitter.com/joseluisgonsan) 29 | [![GitHub](https://img.shields.io/github/followers/joseluisgs?style=social)](https://github.com/joseluisgs) 30 | 31 | ### Contacto 32 |

33 | Cualquier cosa que necesites házmelo saber por si puedo ayudarte 💬. 34 |

35 |

36 | 37 | 39 |    40 | 41 | 43 |    44 | 45 | 47 |    48 | 49 | 51 | 52 |

-------------------------------------------------------------------------------- /Regex/davechild_regular-expressions.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-08-2021-2022/be39cbce5e9e73858b2c7802b70045b274150272/Regex/davechild_regular-expressions.pdf -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/.gitignore: -------------------------------------------------------------------------------- 1 | /out 2 | /prueba.txt 3 | /backup 4 | /data -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/03-FicherosTexto.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/src/es/joseluisgs/dam/FicherosTexto.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import java.io.*; 4 | 5 | public class FicherosTexto { 6 | public static void testEscribirFicheroTexto() { 7 | File fichero = null; 8 | PrintWriter f = null; 9 | try 10 | { 11 | 12 | fichero = new File("prueba.txt"); 13 | System.out.println("Escribiendo en el fichero:"+fichero.getAbsolutePath()); 14 | 15 | 16 | 17 | 18 | // Creamos el buffer y le asociamos el fichero 19 | // Usamos PrintWriter y no BufferedWriter porque tiene mejores metodos 20 | // Pero podríamos usar BufferedWriter y usar \n 21 | // al poner FileWriter -> true no sobrescribimos 22 | f = new PrintWriter(new FileWriter(fichero,true)); 23 | 24 | // Escribimos diez lineas 25 | for (int i = 0; i < 10; i++){ 26 | f.println("Linea:"+i); //-->> 27 | } 28 | // vamos a escribir la propia ruta del fichero en el fichero 29 | // usamos la clase file 30 | 31 | f.println(fichero.getAbsolutePath()); 32 | 33 | } catch (IOException e) { 34 | e.printStackTrace(); 35 | } finally { 36 | try { 37 | // Nuevamente aprovechamos el finally para 38 | // asegurarnos que se cierra el fichero. 39 | if (f != null) 40 | f.close(); 41 | } catch (Exception e2) { 42 | e2.printStackTrace(); 43 | } 44 | } 45 | } 46 | 47 | public static void testLeerFicheroTexto() { 48 | File fichero = null; 49 | BufferedReader f = null; 50 | try 51 | { 52 | 53 | fichero = new File("prueba.txt"); 54 | System.out.println("Leyendo del fichero:"+fichero.getAbsolutePath()); 55 | 56 | // Creamos el buffer y le asociamos el fichero 57 | f = new BufferedReader(new FileReader(fichero)); 58 | 59 | //leemos hasta el final del fichero linea a línea 60 | String linea = f.readLine(); 61 | while(linea!=null){ 62 | System.out.println(linea); // --->> 63 | linea = f.readLine(); 64 | } 65 | 66 | //Otra forma más corta 67 | //String linea; 68 | //while((linea=f.readLine())!=null){ 69 | //System.out.println(linea); 70 | //} 71 | } catch (IOException e) { 72 | e.printStackTrace(); 73 | } finally { 74 | try { 75 | // Nuevamente aprovechamos el finally para 76 | // asegurarnos que se cierra el fichero. 77 | if (f != null) 78 | f.close(); 79 | } catch (Exception e2) { 80 | e2.printStackTrace(); 81 | } 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/src/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import es.joseluisgs.dam.controllers.PersonaController; 4 | import es.joseluisgs.dam.model.Persona; 5 | 6 | import java.util.List; 7 | 8 | public class Main { 9 | 10 | public static void main(String[] args) { 11 | // FicherosTexto.testEscribirFicheroTexto(); 12 | // FicherosTexto.testLeerFicheroTexto(); 13 | PersonaController pc = new PersonaController(); 14 | pc.getDir(); 15 | List personas = List.of( 16 | new Persona("Juan", "juan@juan.es"), 17 | new Persona("Pepe", "pepe@pepe.es"), 18 | new Persona("Luis", "luis@luis.es") 19 | ); 20 | pc.savePersonas(personas, false); 21 | List res = pc.readPersonas(); 22 | for (Persona p : res) { 23 | System.out.println(p); 24 | } 25 | 26 | pc.backup(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/src/es/joseluisgs/dam/controllers/PersonaController.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.controllers; 2 | 3 | import es.joseluisgs.dam.model.Persona; 4 | 5 | import java.io.*; 6 | import java.nio.file.Files; 7 | import java.nio.file.Path; 8 | import java.nio.file.Paths; 9 | import java.time.LocalDateTime; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | public class PersonaController { 14 | private Path currentRelativePath = Paths.get(""); 15 | private String ruta = currentRelativePath.toAbsolutePath().toString(); 16 | private final String dir = ruta + File.separator + "data"; 17 | private final String backup = ruta + File.separator + "backup"; 18 | private final String personasFile = dir + File.separator + "personas.txt"; 19 | 20 | public PersonaController() { 21 | init(); 22 | } 23 | 24 | private void init() { 25 | File directory = new File(this.dir); 26 | if (!directory.exists()) { 27 | directory.mkdir(); 28 | } 29 | 30 | Path path = Paths.get(dir); 31 | if (!Files.exists(path)) { 32 | try { 33 | Files.createDirectories(path); 34 | } catch (IOException e) { 35 | System.out.println("Error: " + e.getMessage()); 36 | } 37 | } 38 | } 39 | 40 | public void getDir() { 41 | System.out.println(dir); 42 | } 43 | 44 | public void savePersonas(List personas, boolean append) { 45 | File fichero = null; 46 | PrintWriter f = null; 47 | try { 48 | fichero = new File(personasFile); 49 | f = new PrintWriter(new FileWriter(personasFile,append)); 50 | 51 | for (Persona p : personas) { 52 | f.println(p.toFile()); 53 | } 54 | 55 | } catch (Exception e) { 56 | System.out.println("Error: " + e.getMessage()); 57 | } finally { 58 | if (f != null) { 59 | f.close(); 60 | } 61 | } 62 | } 63 | 64 | public List readPersonas() { 65 | File fichero = null; 66 | BufferedReader f = null; 67 | List personas = new ArrayList<>(); 68 | try { 69 | fichero = new File(personasFile); 70 | f = new BufferedReader(new FileReader(fichero)); 71 | 72 | String linea; 73 | while ((linea = f.readLine()) != null) { 74 | personas.add(getPersona(linea)); 75 | } 76 | 77 | } catch (Exception e) { 78 | System.out.println("Error: " + e.getMessage()); 79 | } finally { 80 | if (f != null) { 81 | try { 82 | f.close(); 83 | } catch (IOException e) { 84 | System.out.println("Error: " + e.getMessage()); 85 | } 86 | } 87 | } 88 | return personas; 89 | } 90 | 91 | private Persona getPersona(String linea) { 92 | String[] campos = linea.split(";"); 93 | var id = Integer.parseInt(campos[0]); 94 | var nombre = campos[1]; 95 | var email = campos[2]; 96 | var createdAt = LocalDateTime.parse(campos[3]); 97 | var p = new Persona(id, nombre, email, createdAt); 98 | // System.out.println(p); 99 | return p; 100 | } 101 | 102 | 103 | public void backup() { 104 | Path pathOrigen = Paths.get(personasFile); 105 | Path pathFinal = Paths.get(backup + File.separator + "personas.bak"); 106 | if (!Files.exists(Paths.get(backup))) { 107 | try { 108 | Files.createDirectories(Paths.get(backup)); 109 | Files.copy(pathOrigen, pathFinal); 110 | } catch (IOException e) { 111 | System.out.println("Error: " + e.getMessage()); 112 | } 113 | } 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /Soluciones/01-FicherosTexto/src/es/joseluisgs/dam/model/Persona.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.model; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | public class Persona { 6 | private int id; 7 | private String nombre; 8 | private String email; 9 | private LocalDateTime createdAt; 10 | 11 | private static int contador = 0; 12 | 13 | public Persona(String nombre, String email) { 14 | this.id = ++contador; 15 | this.nombre = nombre; 16 | this.email = email; 17 | this.createdAt = LocalDateTime.now(); 18 | } 19 | 20 | public Persona(int id, String nombre, String email, LocalDateTime createdAt) { 21 | this.id = id; 22 | this.nombre = nombre; 23 | this.email = email; 24 | this.createdAt = createdAt; 25 | } 26 | 27 | @Override 28 | public String toString() { 29 | return "Persona{" + "id=" + id + ", nombre=" + nombre + ", email=" + email + ", createdAt=" + createdAt + '}'; 30 | } 31 | 32 | public String toFile() { 33 | return id + ";" + nombre + ";" + email + ";" + createdAt; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/.gitignore: -------------------------------------------------------------------------------- 1 | /out 2 | /empleados 3 | /backup 4 | /data -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/04-FicherosBinarios.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/src/es/joseluisgs/dam/FicherosBinarios.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import es.joseluisgs.dam.model.Empleado; 4 | 5 | import java.io.*; 6 | import java.util.Stack; 7 | 8 | public class FicherosBinarios { 9 | public static void testEscribirFicheroBinario() { 10 | 11 | // Rutas de ficheros 12 | ObjectOutputStream f = null; 13 | File fichero = null; 14 | 15 | Empleado empleado1=new Empleado("Fernando", "Ureña", 23, 800); 16 | Empleado empleado2=new Empleado("Antonio", "Lopez", 35, 1000); 17 | 18 | Stack pila= new Stack(); 19 | 20 | pila.add(empleado1); 21 | pila.add(empleado2); 22 | 23 | try{ 24 | fichero = new File("empleados"); 25 | f = new ObjectOutputStream(new FileOutputStream(fichero)); 26 | //Escribimos en un fichero 27 | // podríamos escribir un array list o arbol si todos son 28 | // serializables 29 | System.out.println("Escribiendo objetos binarios en:"+fichero.getAbsolutePath()); 30 | f.writeObject(empleado1); 31 | f.writeObject(empleado2); 32 | f.writeObject(pila); 33 | System.out.println("Escritos"); 34 | }catch(IOException e){ 35 | //e.printStackTrace(); 36 | } finally { 37 | try { 38 | // Nuevamente aprovechamos el finally para 39 | // asegurarnos que se cierra el fichero. 40 | if (f != null) 41 | f.close(); 42 | System.out.println("Fichero cerrado"); 43 | } catch (Exception e2) { 44 | e2.printStackTrace(); 45 | } 46 | } 47 | } 48 | 49 | public static void testLeerFicheroBinario(){ 50 | // Rutas de ficheros 51 | ObjectInputStream f = null; 52 | File fichero = null; 53 | 54 | try{ 55 | fichero = new File("empleados"); 56 | f = new ObjectInputStream(new FileInputStream(fichero)); 57 | //Escribimos en un fichero 58 | // podríamos escribir un array list o arbol si todos son 59 | // serializables 60 | System.out.println("Leyendo objetos binarios en:"+fichero.getAbsolutePath()); 61 | 62 | // Se lee el primer objeto 63 | Empleado emp1 = (Empleado)f.readObject(); 64 | System.out.println(emp1.toString()); 65 | Empleado emp2 = (Empleado)f.readObject(); 66 | System.out.println(emp2.toString()); 67 | Stack pila= (Stack) f.readObject(); 68 | System.out.println(pila.pop().toString()); 69 | System.out.println(pila.pop().toString()); 70 | System.out.println(pila.empty()); 71 | /* 72 | while(aux!=null){ 73 | if (aux instanceof Empleado){ 74 | System.out.println(aux.toString()); 75 | } 76 | // Leemos si hay mas objetos 77 | aux=(Empleado)f.readObject(); 78 | 79 | } 80 | */ 81 | }catch(IOException e){ 82 | //e.printStackTrace(); 83 | } catch (ClassNotFoundException ex) { 84 | System.err.println("Clases Incompatibles"); 85 | } finally { 86 | try { 87 | // Nuevamente aprovechamos el finally para 88 | // asegurarnos que se cierra el fichero. 89 | if (f != null) 90 | f.close(); 91 | System.out.println("Fichero cerrado"); 92 | } catch (Exception e2) { 93 | e2.printStackTrace(); 94 | } 95 | } 96 | } 97 | 98 | } 99 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/src/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import es.joseluisgs.dam.controllers.PersonaController; 4 | import es.joseluisgs.dam.model.Persona; 5 | 6 | import java.util.List; 7 | 8 | public class Main { 9 | 10 | public static void main(String[] args) { 11 | // FicherosBinarios.testEscribirFicheroBinario(); 12 | // FicherosBinarios.testLeerFicheroBinario(); 13 | PersonaController pc = new PersonaController(); 14 | pc.getDir(); 15 | List personas = List.of( 16 | new Persona("Juan", "juan@juan.es"), 17 | new Persona("Pepe", "pepe@pepe.es"), 18 | new Persona("Luis", "luis@luis.es") 19 | ); 20 | pc.savePersonas1By1(personas, false); 21 | List res = pc.readPersonas1By1(); 22 | for (Persona p : res) { 23 | System.out.println(p); 24 | } 25 | 26 | pc.savePersonasList(personas, false); 27 | List res2 = pc.readPersonasList(); 28 | for (Persona p : res2) { 29 | System.out.println(p); 30 | } 31 | 32 | pc.backup(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/src/es/joseluisgs/dam/controllers/PersonaController.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.controllers; 2 | 3 | import es.joseluisgs.dam.model.Persona; 4 | 5 | import java.io.*; 6 | import java.nio.file.Files; 7 | import java.nio.file.Path; 8 | import java.nio.file.Paths; 9 | import java.time.LocalDateTime; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | public class PersonaController { 14 | private Path currentRelativePath = Paths.get(""); 15 | private String ruta = currentRelativePath.toAbsolutePath().toString(); 16 | private final String dir = ruta + File.separator + "data"; 17 | private final String backup = ruta + File.separator + "backup"; 18 | private final String personasFile = dir + File.separator + "personas.dat"; 19 | 20 | public PersonaController() { 21 | init(); 22 | } 23 | 24 | private void init() { 25 | File directory = new File(this.dir); 26 | if (!directory.exists()) { 27 | directory.mkdir(); 28 | } 29 | 30 | Path path = Paths.get(dir); 31 | if (!Files.exists(path)) { 32 | try { 33 | Files.createDirectories(path); 34 | } catch (IOException e) { 35 | System.out.println("Error: " + e.getMessage()); 36 | } 37 | } 38 | } 39 | 40 | public void getDir() { 41 | System.out.println(dir); 42 | } 43 | 44 | public void savePersonas1By1(List personas, boolean append) { 45 | File fichero = null; 46 | ObjectOutputStream f = null; 47 | try { 48 | fichero = new File(personasFile); 49 | f = new ObjectOutputStream(new FileOutputStream(fichero, append)); 50 | 51 | for (Persona p : personas) { 52 | f.writeObject(p); 53 | } 54 | 55 | } catch (Exception e) { 56 | System.out.println("Error Write: " + e.getMessage()); 57 | } finally { 58 | if (f != null) { 59 | try { 60 | f.close(); 61 | } catch (IOException e) { 62 | System.out.println("Error Close Write: " + e.getMessage()); 63 | } 64 | } 65 | } 66 | } 67 | 68 | public List readPersonas1By1() { 69 | File fichero = null; 70 | ObjectInputStream f = null; 71 | List personas = new ArrayList<>(); 72 | try { 73 | fichero = new File(personasFile); 74 | f = new ObjectInputStream(new FileInputStream(fichero)); 75 | 76 | Persona persona; 77 | while ((persona = (Persona) f.readObject()) != null) { 78 | personas.add(persona); 79 | } 80 | 81 | } catch (ClassNotFoundException e) { 82 | System.out.println("Error Read: " + e.getMessage()); 83 | } catch (EOFException e) { 84 | // System.out.println("Fin de fichero"); 85 | } catch (IOException e) { 86 | e.printStackTrace(); 87 | } finally { 88 | if (f != null) { 89 | try { 90 | f.close(); 91 | } catch (IOException e) { 92 | System.out.println("Error Close Read: " + e.getMessage()); 93 | } 94 | } 95 | } 96 | return personas; 97 | } 98 | 99 | public void backup() { 100 | Path pathOrigen = Paths.get(personasFile); 101 | Path pathFinal = Paths.get(backup + File.separator + "personas.bak"); 102 | if (!Files.exists(Paths.get(backup))) { 103 | try { 104 | Files.createDirectories(Paths.get(backup)); 105 | Files.copy(pathOrigen, pathFinal); 106 | } catch (IOException e) { 107 | System.out.println("Error: " + e.getMessage()); 108 | } 109 | } 110 | } 111 | 112 | public void savePersonasList(List personas, boolean append) { 113 | File fichero = null; 114 | ObjectOutputStream f = null; 115 | try { 116 | fichero = new File(personasFile); 117 | f = new ObjectOutputStream(new FileOutputStream(fichero, append)); 118 | 119 | f.writeObject(personas); 120 | 121 | } catch (Exception e) { 122 | System.out.println("Error Write: " + e.getMessage()); 123 | } finally { 124 | if (f != null) { 125 | try { 126 | f.close(); 127 | } catch (IOException e) { 128 | System.out.println("Error Close Write: " + e.getMessage()); 129 | } 130 | } 131 | } 132 | } 133 | 134 | public List readPersonasList() { 135 | File fichero = null; 136 | ObjectInputStream f = null; 137 | List personas = new ArrayList<>(); 138 | try { 139 | fichero = new File(personasFile); 140 | f = new ObjectInputStream(new FileInputStream(fichero)); 141 | 142 | personas = (List) f.readObject(); 143 | 144 | } catch (ClassNotFoundException | IOException e) { 145 | System.out.println("Error Read: " + e.getMessage()); 146 | } finally { 147 | if (f != null) { 148 | try { 149 | f.close(); 150 | } catch (IOException e) { 151 | System.out.println("Error Close Read: " + e.getMessage()); 152 | } 153 | } 154 | } 155 | return personas; 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/src/es/joseluisgs/dam/model/Empleado.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.model; 2 | 3 | import java.io.Serializable; 4 | import java.util.Objects; 5 | 6 | /** 7 | * 8 | * @author joseluisgs 9 | */ 10 | public class Empleado implements Serializable, Comparable{ 11 | 12 | private static final long serialVersionUID = -2873344211410398459L; 13 | 14 | //Constantes 15 | /** 16 | * Constante SALARIO_DEF 17 | */ 18 | protected final static double SALARIO_DEF=600; 19 | 20 | //Atributos 21 | 22 | /** 23 | * Nombre del empleado 24 | */ 25 | protected String nombre; 26 | /** 27 | * Apellido del empleado 28 | */ 29 | protected String apellido; 30 | /** 31 | * Edad del empleado 32 | */ 33 | protected int edad; 34 | /** 35 | * Salario del empleado 36 | */ 37 | protected double salario; 38 | 39 | //Metodos publicos 40 | 41 | /** 42 | * Devuelve el nombre del empleado 43 | * @return nombre del empleado 44 | */ 45 | public String getNombre() { 46 | return nombre; 47 | } 48 | 49 | /** 50 | * Modifica el nombre de un empleado 51 | * @param nombre 52 | */ 53 | public void setNombre(String nombre) { 54 | this.nombre = nombre; 55 | } 56 | 57 | /** 58 | * Devuelve la edad de un empleado 59 | * @return edad del empleado 60 | */ 61 | public int getEdad() { 62 | return edad; 63 | } 64 | 65 | /** 66 | * Modifica la edad de un empleado 67 | * @param edad 68 | */ 69 | public void setEdad(int edad) { 70 | this.edad = edad; 71 | } 72 | 73 | /** 74 | * Devuelve el salarioBase 75 | * @return salarioBse 76 | */ 77 | public double getSalario() { 78 | return salario; 79 | } 80 | 81 | /** 82 | * Modifica el salarioBase de los empleados 83 | * @param salarioBase 84 | */ 85 | public void setSalario(double salario) { 86 | this.salario = salario; 87 | } 88 | 89 | public boolean plus (double sueldoPlus){ 90 | 91 | boolean aumento=false; 92 | if (edad>40){ 93 | salario+=sueldoPlus; 94 | aumento=true; 95 | } 96 | return aumento; 97 | } 98 | 99 | public boolean equals (Empleado a){ 100 | 101 | if(a.getNombre().equals(nombre) && a.getApellido().equals(apellido)){ 102 | return true; 103 | }else{ 104 | return false; 105 | } 106 | } 107 | 108 | @Override 109 | public int compareTo(Empleado a){ 110 | int estado=-1; 111 | if(this.edad==a.getEdad()){ 112 | //Los objetos son iguales 113 | estado=0; 114 | }else if(this.edad>a.getEdad()){ 115 | //El objeto 1 es mayor que la pasada por parametro 116 | estado=1; 117 | } 118 | return estado; 119 | 120 | } 121 | @Override 122 | public String toString (){ 123 | String mensaje="El empleado se llama "+nombre+" "+apellido+" con "+edad+" años " + 124 | "y un salario de "+salario; 125 | return mensaje; 126 | } 127 | public String getApellido() { 128 | return apellido; 129 | } 130 | 131 | //Constructores 132 | /** 133 | * Constructor por defecto 134 | */ 135 | public Empleado(){ 136 | this ("", "", 0, SALARIO_DEF); 137 | } 138 | 139 | /** 140 | * Constructor con 2 parametros 141 | * @param nombre nombre del empleado 142 | * @param apellido nombre del empleado 143 | */ 144 | public Empleado(String nombre, String apellido){ 145 | this (nombre, apellido, 0, SALARIO_DEF); 146 | } 147 | 148 | 149 | /** 150 | * Constructor con 3 parametros 151 | * @param nombre nombre del empleado 152 | * @param apellido nombre del empleado 153 | * @param edad edad del empleado 154 | */ 155 | public Empleado (String nombre, String apellido, int edad){ 156 | this (nombre, apellido, edad, SALARIO_DEF); 157 | } 158 | /** 159 | * Constructor con 4 parametros 160 | * @param nombre nombre del empleado 161 | * @param apellido nombre del empleado 162 | * @param edad edad del empleado 163 | * @param salario salario del empleado 164 | */ 165 | public Empleado(String nombre, String apellido, int edad, double salario){ 166 | this.nombre=nombre; 167 | this.apellido=apellido; 168 | this.edad=edad; 169 | this.salario=salario; 170 | } 171 | 172 | 173 | 174 | @Override 175 | public boolean equals(Object obj) { 176 | if (this == obj) { 177 | return true; 178 | } 179 | if (obj == null) { 180 | return false; 181 | } 182 | if (getClass() != obj.getClass()) { 183 | return false; 184 | } 185 | final Empleado other = (Empleado) obj; 186 | if (this.edad != other.edad) { 187 | return false; 188 | } 189 | if (Double.doubleToLongBits(this.salario) != Double.doubleToLongBits(other.salario)) { 190 | return false; 191 | } 192 | if (!Objects.equals(this.nombre, other.nombre)) { 193 | return false; 194 | } 195 | if (!Objects.equals(this.apellido, other.apellido)) { 196 | return false; 197 | } 198 | return true; 199 | } 200 | 201 | @Override 202 | public int hashCode() { 203 | int hash = 7; 204 | hash = 29 * hash + Objects.hashCode(this.nombre); 205 | hash = 29 * hash + Objects.hashCode(this.apellido); 206 | hash = 29 * hash + this.edad; 207 | hash = 29 * hash + (int) (Double.doubleToLongBits(this.salario) ^ (Double.doubleToLongBits(this.salario) >>> 32)); 208 | return hash; 209 | } 210 | 211 | } 212 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/src/es/joseluisgs/dam/model/Persona.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.model; 2 | 3 | import es.joseluisgs.dam.utils.Formatter; 4 | 5 | import java.io.Serializable; 6 | import java.time.LocalDateTime; 7 | 8 | public class Persona implements Serializable { 9 | private static final long serialVersionUID = -87908723585899098L; 10 | private int id; 11 | private String nombre; 12 | private String email; 13 | private LocalDateTime createdAt; 14 | private Double salario; 15 | 16 | private static int contador = 0; 17 | 18 | public Persona(String nombre, String email) { 19 | this.id = ++contador; 20 | this.nombre = nombre; 21 | this.email = email; 22 | this.createdAt = LocalDateTime.now(); 23 | this.salario = Math.random() * 100000; 24 | } 25 | 26 | public Persona(int id, String nombre, String email, LocalDateTime createdAt) { 27 | this.id = id; 28 | this.nombre = nombre; 29 | this.email = email; 30 | this.createdAt = createdAt; 31 | } 32 | 33 | @Override 34 | public String toString() { 35 | return "Persona{" + "id=" + id + ", nombre=" + nombre + ", email=" + email + ", createdAt=" + Formatter.dateParser(createdAt) + ", salario=" + Formatter.moneyParser(salario) + '}'; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Soluciones/02-FicherosBinarios/src/es/joseluisgs/dam/utils/Formatter.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.utils; 2 | 3 | import java.text.NumberFormat; 4 | import java.time.LocalDateTime; 5 | import java.time.format.DateTimeFormatter; 6 | import java.time.format.FormatStyle; 7 | import java.util.Locale; 8 | 9 | public class Formatter { 10 | 11 | public static String dateParser(LocalDateTime date) { 12 | final Locale locale = new Locale("es", "ES"); 13 | // private String pattern = "dd/MM/yyyy"; 14 | return date.format(DateTimeFormatter 15 | .ofLocalizedDate(FormatStyle.FULL).withLocale(locale)); 16 | } 17 | 18 | public static String moneyParser(Double money) { 19 | final Locale locale = new Locale("es", "ES"); 20 | return NumberFormat.getCurrencyInstance(locale).format(money); 21 | } 22 | 23 | public static String doubleParser(Double number) { 24 | final Locale locale = new Locale("es", "ES"); 25 | return NumberFormat.getInstance(locale).format(number); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/.gitignore: -------------------------------------------------------------------------------- 1 | /out 2 | /enteros.dat 3 | /texto.txt -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/05-FicherosAccesoAleatorio.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/src/es/joseluisgs/dam/EjemplosVarios.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import java.io.EOFException; 4 | import java.io.FileNotFoundException; 5 | import java.io.IOException; 6 | import java.io.RandomAccessFile; 7 | import java.util.Scanner; 8 | 9 | public class EjemplosVarios { 10 | /* Pide un número entero por teclado y lo añade al final de un fichero binario enteros.dat que contiene números enteros. 11 | El programa utiliza un método mostrarFichero() que se llama dos veces. La primera muestra el contenido del fichero antes 12 | de añadir el nuevo número y la segunda llamada muestra el fichero después de añadirlo.*/ 13 | public static void escribirEntero() { 14 | Scanner sc = new Scanner(System.in); 15 | RandomAccessFile fichero = null; 16 | int numero; 17 | try { 18 | //se abre el fichero para lectura y escritura 19 | fichero = new RandomAccessFile("enteros.dat", "rw"); 20 | mostrarFichero(); //muestra el contenido original del fichero 21 | System.out.print("Introduce un número entero para añadir al final del fichero: "); 22 | numero = sc.nextInt(); //se lee el entero a añadir en el fichero 23 | fichero.seek(fichero.length()); //nos situamos al final del fichero 24 | fichero.writeInt(numero); //se escribe el entero 25 | mostrarFichero();//muestra el contenido del fichero después de añadir el número 26 | 27 | } catch (FileNotFoundException ex) { 28 | System.out.println(ex.getMessage()); 29 | } catch (IOException ex) { 30 | System.out.println(ex.getMessage()); 31 | } finally { 32 | try { 33 | if (fichero != null) { 34 | fichero.close(); 35 | } 36 | } catch (IOException e) { 37 | System.out.println(e.getMessage()); 38 | } 39 | } 40 | } 41 | 42 | 43 | public static void mostrarFichero() { 44 | RandomAccessFile fichero = null; 45 | try { 46 | fichero = new RandomAccessFile("enteros.dat", "r"); 47 | int n; 48 | try { 49 | fichero.seek(0); //nos situamos al principio 50 | while (true) { 51 | n = fichero.readInt(); //se lee un entero del fichero 52 | System.out.println(n); //se muestra en pantalla 53 | 54 | } 55 | } catch (EOFException e) { 56 | System.out.println("Fin de fichero"); 57 | } catch (IOException ex) { 58 | System.out.println(ex.getMessage()); 59 | } 60 | } catch (FileNotFoundException e) { 61 | e.printStackTrace(); 62 | } finally { 63 | try { 64 | if (fichero != null) { 65 | fichero.close(); 66 | } 67 | } catch (IOException e) { 68 | System.out.println(e.getMessage()); 69 | } 70 | } 71 | } 72 | 73 | /*Modifica un entero dentro del fichero enteros.dat con acceso aleatorio. 74 | Para ello se pide la posición que ocupa el entero a modificar dentro del fichero, 75 | a continuación se lee y muestra el valor actual, se pide el nuevo valor y finalmente se escribe el nuevo valor 76 | en la posición indicada, modificando de esta forma el valor antiguo por el nuevo.*/ 77 | public static void modificarEntero() { 78 | Scanner sc = new Scanner(System.in); 79 | RandomAccessFile fichero = null; 80 | int pos, numero; 81 | long size; 82 | try { 83 | fichero = new RandomAccessFile("enteros.dat", "rw"); 84 | 85 | //calcular cuántos enteros tiene el fichero 86 | size = fichero.length(); 87 | size = size / 4; 88 | System.out.println("El fichero tiene " + size + " enteros"); 89 | 90 | //Modificar el entero que se encuentra en una posición determinada 91 | do { 92 | System.out.println("Introduce una posición (>=1 y <= " + size + "): "); 93 | pos = sc.nextInt(); 94 | } while (pos < 1 || pos > size); 95 | 96 | pos--; //la posición 1 realmente es la 0 97 | 98 | //nos situamos en la posición (byte de inicio) del entero a modificar 99 | //en Java un entero ocupa 4 bytes 100 | fichero.seek(pos * 4); 101 | 102 | //leemos y mostramos el valor actual 103 | System.out.println("Valor actual: " + fichero.readInt()); 104 | 105 | //pedimos que se introduzca el nuevo valor 106 | System.out.println("Introduce nuevo valor: "); 107 | numero = sc.nextInt(); 108 | 109 | //nos situamos de nuevo en la posición del entero a modificar 110 | //esto es necesario porque después de la lectura que hemos realizado para mostrar 111 | //el valor el puntero de lectura/escritura ha avanzado al siguiente entero del fichero. 112 | //si no hacemos esto escribiremos sobre el siguiente entero 113 | fichero.seek(pos * 4); 114 | 115 | //escribimos el entero 116 | fichero.writeInt(numero); 117 | 118 | } catch (FileNotFoundException ex) { 119 | System.out.println(ex.getMessage()); 120 | } catch (IOException ex) { 121 | System.out.println(ex.getMessage()); 122 | } finally { 123 | try { 124 | if (fichero != null) { 125 | fichero.close(); 126 | } 127 | } catch (IOException e) { 128 | System.out.println(e.getMessage()); 129 | } 130 | } 131 | } 132 | /* Ejemplo de uso de un fichero de caracteres con acceso aleatorio. 133 | Se pide por teclado una palabra, la busca el fichero de texto texto.txt y la modifica escribiéndola en mayúsculas 134 | cada vez que aparece en el fichero.Para hacer el cambio de la palabra por su equivalente en mayúsculas, el programa 135 | lee el fichero por líneas. Para cada línea leída se comprueba si contiene la palabra buscada y si es así se modifica 136 | y se sobrescribe la línea completa modificada. */ 137 | public static void palabras() { 138 | Scanner sc = new Scanner(System.in); 139 | RandomAccessFile fichero = null; 140 | String palabra, cadena; 141 | StringBuilder auxBuilder; 142 | long pos = 0; 143 | int indice; 144 | try { 145 | //se abre el fichero para lectura/escritura 146 | fichero = new RandomAccessFile("texto.txt", "rw"); 147 | 148 | //Se pide la palabra a buscar 149 | System.out.print("Introduce palabra: "); 150 | palabra = sc.nextLine().trim(); 151 | 152 | //lectura del fichero 153 | cadena = fichero.readLine(); //leemos la primera línea 154 | while (cadena != null) { //mientras no lleguemos al final del fichero 155 | indice = cadena.indexOf(palabra); //buscamos la palabra en la línea leída 156 | while (indice != -1) { //mientras la línea contenga esa palabra (por si está repetida) 157 | 158 | //paso la línea a un StringBuilder para modificarlo 159 | auxBuilder = new StringBuilder(cadena); 160 | auxBuilder.replace(indice, indice + palabra.length(), palabra.toUpperCase()); 161 | cadena = auxBuilder.toString(); 162 | 163 | //nos posicionamos al principio de la línea actual y se sobrescribe la 164 | //línea completa 165 | //La posición donde empieza la línea actual la estoy guardando 166 | //en la variable pos 167 | fichero.seek(pos); 168 | fichero.writeBytes(cadena); 169 | 170 | //compruebo si se repite la misma palabra en la línea 171 | indice = cadena.indexOf(palabra); 172 | } 173 | pos = fichero.getFilePointer(); //posición de la línea actual que voy a leer 174 | cadena = fichero.readLine(); //lectura de la línea 175 | } 176 | } catch (FileNotFoundException ex) { 177 | System.out.println(ex.getMessage()); 178 | } catch (IOException ex) { 179 | System.out.println(ex.getMessage()); 180 | } finally { 181 | try { 182 | if (fichero != null) { 183 | fichero.close(); 184 | } 185 | } catch (IOException e) { 186 | System.out.println(e.getMessage()); 187 | } 188 | } 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /Soluciones/03-FicherosAccesoAleatorio/src/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | //EjemplosVarios.escribirEntero(); 6 | //EjemplosVarios.modificarEntero(); 7 | //EjemplosVarios.mostrarFichero(); 8 | EjemplosVarios.palabras(); 9 | 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/.gitignore: -------------------------------------------------------------------------------- 1 | /out 2 | /fichero.txt -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/06-FicherosDirectorios.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Soluciones/04-FicherosDirectorios/src/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.util.Arrays; 6 | 7 | public class Main { 8 | 9 | public static void main(String[] args) throws IOException, IOException { 10 | 11 | 12 | //Creamos objetos File 13 | //Asegurate que existan 14 | File fichero=new File("06-FicherosDirectorios.iml"); // Debe existir 15 | File fichero2=new File("fichero.txt"); 16 | File directorio=new File("src"); // Debe existir y llenalo de coSAS 17 | File directorio2=new File("directorio"); 18 | 19 | 20 | //Indica si existen los archivos 21 | System.out.println("Existencia: "); 22 | System.out.println("Fichero "+fichero.exists()); 23 | System.out.println("Directorio "+directorio.exists()); 24 | 25 | System.out.println(""); 26 | 27 | //Indica si son directorios 28 | System.out.println("¿Son directorios?: "); 29 | System.out.println("Fichero "+fichero.isDirectory()); 30 | System.out.println("Directorio "+directorio.isDirectory()); 31 | 32 | System.out.println(""); 33 | 34 | //Indica si son ficheros 35 | System.out.println("¿Son ficheros?: "); 36 | System.out.println("Fichero "+fichero.isFile()); 37 | System.out.println("Directorio "+directorio.isFile()); 38 | 39 | System.out.println(""); 40 | 41 | //Indica la ruta absoluta del fichero o directorio 42 | System.out.println("Ruta absoluta: "); 43 | System.out.println("Fichero "+fichero.getAbsolutePath()); 44 | System.out.println("Directorio "+directorio.getAbsolutePath()); 45 | 46 | System.out.println(""); 47 | 48 | //Indica si se puede leer 49 | System.out.println("¿Se pueden leer?:"); 50 | System.out.println("Fichero "+fichero.canRead()); 51 | System.out.println("Directorio "+directorio.canRead()); 52 | 53 | System.out.println(""); 54 | 55 | //Indica si se puede escribir 56 | System.out.println("¿Se pueden escribir?:"); 57 | System.out.println("Fichero "+fichero.canWrite()); 58 | System.out.println("Directorio "+directorio.canWrite()); 59 | 60 | System.out.println(""); 61 | 62 | //Indica si se puede ejecutar 63 | System.out.println("¿Se pueden ejecutar?:"); 64 | System.out.println("Fichero "+fichero.canExecute()); 65 | System.out.println("Directorio "+directorio.canExecute()); 66 | 67 | System.out.println(""); 68 | 69 | //Indica el nombre sin rutas 70 | System.out.println("Nombres sin rutas: "); 71 | System.out.println("Fichero "+fichero.getName()); 72 | System.out.println("Directorio "+directorio.getName()); 73 | 74 | System.out.println(""); 75 | 76 | //Indica el nombre del directorio padre 77 | System.out.println("Nombre del directorio padre: "); 78 | System.out.println("Fichero "+fichero.getParent()); 79 | System.out.println("Directorio "+directorio.getParent()); 80 | 81 | System.out.println(""); 82 | 83 | //Guarda en un array de File los directorios hijos, solo con directorios 84 | System.out.println("Nombre de los objetos File dentro de un array"); 85 | File lista[]=directorio.listFiles(); 86 | 87 | for (File f: lista){ 88 | System.out.println(f); 89 | } 90 | 91 | System.out.println(""); 92 | 93 | //Guarda en un array de String los directorios hijos, solo con directorios 94 | System.out.println("Nombre de los objetos String dentro de un array"); 95 | String listaString[]=directorio.list(); 96 | 97 | for (String s : listaString) { 98 | System.out.println(s); 99 | } 100 | 101 | System.out.println(""); 102 | 103 | //Crea el directorio (no existe) 104 | System.out.println("Creando directorio..."); 105 | System.out.println(directorio2.mkdir()); 106 | 107 | System.out.println(""); 108 | 109 | //Crea el fichero (no existe), debe controlarse la excepcion (arriba lanzamos la excepcion) 110 | System.out.println("Creando fichero..."); 111 | System.out.println(fichero2.createNewFile()); 112 | 113 | // Copiar ficheros y directorios JAVA NIO2 114 | //Files.copy(path, out) 115 | 116 | 117 | // borrar ficheros o directorios 118 | //fichero.delete(); 119 | //directorio.delete(); 120 | //Files.deleteIfExists(path) 121 | 122 | // Enlaces y otras operaciones en la clase Files 123 | //Files.createLink(path, path1) 124 | //Files.size(); 125 | // Files.move(); 126 | // Files, .... bla bla bla 127 | 128 | 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/.gitignore: -------------------------------------------------------------------------------- 1 | /out 2 | -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/08-FicherosUtils.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Soluciones/06-FicherosUtils/src/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import java.awt.*; 4 | import java.io.File; 5 | import java.net.URI; 6 | 7 | public class Main { 8 | 9 | public static void main(String[] args) { 10 | // abrir una aplicacion 11 | /*Runtime aplicacion = Runtime.getRuntime(); 12 | try{ 13 | aplicacion.exec("c:\\Program Files (x86)\\Notepad++\\notepad++.exe "+fichero2.getAbsolutePath()); 14 | aplicacion.exec("c:\\Program Files (x86)\\Notepad++\\notepad++.exe "+fichero2.getAbsolutePath()); 15 | } 16 | catch(Exception e) 17 | { 18 | System.err.println(e); 19 | }*/ 20 | 21 | Desktop app = Desktop.getDesktop(); 22 | try{ 23 | app.edit(new File("prueba.txt")); 24 | app.mail(); 25 | app.browse(new URI("https://joseluisgs.github.io/")); 26 | app.print(new File("prueba.txt")); 27 | } 28 | catch(Exception e) 29 | { 30 | System.err.println(e); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.gitignore: -------------------------------------------------------------------------------- 1 | out/ 2 | target/ 3 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.idea/libraries/Maven__com_google_code_gson_gson_2_9_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.idea/libraries/Maven__org_projectlombok_lombok_1_18_22.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/Json-Gson.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | groupId 8 | Json-Gson 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 11 13 | 11 14 | 15 | 16 | 17 | 18 | 19 | com.google.code.gson 20 | gson 21 | 2.9.0 22 | 23 | 24 | 25 | org.projectlombok 26 | lombok 27 | 1.18.22 28 | provided 29 | 30 | 31 | org.projectlombok 32 | lombok 33 | RELEASE 34 | compile 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/src/main/java/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import com.google.gson.Gson; 4 | import com.google.gson.GsonBuilder; 5 | import es.joseluisgs.dam.model.Menu; 6 | import es.joseluisgs.dam.model.Producto; 7 | 8 | import java.util.Arrays; 9 | import java.util.List; 10 | import java.util.Properties; 11 | 12 | public class Main { 13 | 14 | public static void main(String[] args) { 15 | System.out.println("Hola Json con Gson"); 16 | 17 | // escribirJSON(); 18 | 19 | leerJSON(); 20 | 21 | } 22 | 23 | private static void leerJSON() { 24 | System.out.println("Leer un objeto JSON"); 25 | var gson = new GsonBuilder().setPrettyPrinting().create(); 26 | Producto p1 = new Producto("Patata", "Patata de la verdura", 1.5); 27 | String json = gson.toJson(p1); 28 | System.out.println(json); 29 | Producto result = gson.fromJson(json, Producto.class); 30 | System.out.println(result); 31 | if (result.equals(p1)) { 32 | System.out.println("Son iguales"); 33 | } 34 | 35 | System.out.println("Leer una lista de objeto JSON"); 36 | Producto p2 = new Producto("Tomate", "Tomate de la verdura", 2.5); 37 | List productos = List.of(p1, p2); 38 | json = gson.toJson(productos); 39 | System.out.println(json); 40 | List resultList = gson.fromJson(json, List.class); 41 | Producto[] resultArray = gson.fromJson(json, Producto[].class); 42 | System.out.println(resultList); 43 | System.out.println(Arrays.toString(resultArray)); 44 | 45 | Menu m1 = new Menu("Menu 1", "Descripcion del menu 1", productos); 46 | Menu m2 = new Menu("Menu 2", "Descripcion del menu 2", productos); 47 | List menus = List.of(m1, m2); 48 | 49 | System.out.println("Leer una objeto compuesto JSON"); 50 | json = gson.toJson(m1); 51 | System.out.println(json); 52 | Menu resultMenu = gson.fromJson(json, Menu.class); 53 | System.out.println(resultMenu); 54 | json = gson.toJson(menus); 55 | System.out.println(json); 56 | List resultMenus = gson.fromJson(json, List.class); 57 | System.out.println(resultMenus); 58 | Menu[] resultMenusArray = gson.fromJson(json, Menu[].class); 59 | System.out.println(Arrays.toString(resultMenusArray)); 60 | } 61 | 62 | private static void escribirJSON() { 63 | Producto p1 = new Producto("Patata", "Patata de la verdura", 1.5); 64 | Producto p2 = new Producto("Tomate", "Tomate de la verdura", 2.5); 65 | List productos = List.of(p1, p2); 66 | System.out.println("Json de un producto"); 67 | System.out.println(p1); 68 | 69 | Gson gson = new Gson(); 70 | String json = gson.toJson(p1); 71 | System.out.println(json); 72 | 73 | System.out.println("Json de un lista de productos"); 74 | json = gson.toJson(productos); 75 | System.out.println(json); 76 | 77 | gson = new GsonBuilder().setPrettyPrinting().create(); 78 | 79 | System.out.println("Json de un producto PrettyPrinting"); 80 | json = gson.toJson(p1); 81 | System.out.println(json); 82 | 83 | System.out.println("Json de una lista producto PrettyPrinting"); 84 | json = gson.toJson(productos); 85 | System.out.println(json); 86 | 87 | Menu m1 = new Menu("Menu 1", "Descripcion del menu 1", productos); 88 | Menu m2 = new Menu("Menu 2", "Descripcion del menu 2", productos); 89 | List menus = List.of(m1, m2); 90 | 91 | System.out.println("Json de un menú PrettyPrinting"); 92 | json = gson.toJson(m1); 93 | System.out.println(json); 94 | 95 | System.out.println("Json de una lista de menús PrettyPrinting"); 96 | json = gson.toJson(menus); 97 | System.out.println(json); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/src/main/java/es/joseluisgs/dam/model/Menu.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | import java.util.UUID; 8 | 9 | @Data 10 | @AllArgsConstructor 11 | public class Menu { 12 | private final String id = UUID.randomUUID().toString(); 13 | private String nombre; 14 | private String descripcion; 15 | private double precio = 0.0; 16 | private List productos; 17 | 18 | public Menu(String nombre, String descripcion, List productos) { 19 | this.nombre = nombre; 20 | this.descripcion = descripcion; 21 | this.productos = productos; 22 | this.precio = calcularPrecio(); 23 | } 24 | 25 | private double calcularPrecio() { 26 | double precio = 0.0; 27 | for (Producto producto : productos) { 28 | precio += producto.getPrecio(); 29 | } 30 | return precio; 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /Soluciones/07-Json-Gson/src/main/java/es/joseluisgs/dam/model/Producto.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.RequiredArgsConstructor; 6 | 7 | import java.util.UUID; 8 | 9 | @Data 10 | @AllArgsConstructor 11 | public class Producto { 12 | private final String id = UUID.randomUUID().toString(); 13 | private String nombre; 14 | private String descripcion; 15 | private double precio = Math.random() * 100; 16 | } 17 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/.gitignore: -------------------------------------------------------------------------------- 1 | /out 2 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/11-ExpresionesRegulares.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/src/es/joseluisgs/dam/ExrpesionesRegulares.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | public class ExrpesionesRegulares { 7 | public void run() { 8 | patronExacto("abc"); 9 | contieneCadena("wabcrt"); 10 | cadenaEmpieza("abcrty"); 11 | cadenaEmpieza2("abcrty"); 12 | cadenaEmpieza2("Abcrty"); 13 | cadenaConLongitud("abcfrtya"); 14 | cadenaNoEmpiezaConLongitud("adbgsre"); 15 | cadenaNoEmpiezaConLongitud("abcdrt"); 16 | cadenaSoloTieneAoB("abbbbabababa"); 17 | cadenaSoloTiene1YNoSeguidoDe2("11133231167"); 18 | esEmailValido("perico.palotes@iesluisvives.es"); 19 | } 20 | 21 | private void patronExacto(String cadena) { 22 | Pattern pat = Pattern.compile("abc"); 23 | Matcher mat = pat.matcher(cadena); 24 | if (mat.matches()) { 25 | System.out.println("SI"); 26 | } else { 27 | System.out.println("NO"); 28 | } 29 | } 30 | 31 | private void contieneCadena(String cadena) { 32 | Pattern pat = Pattern.compile(".*abc.*"); 33 | Matcher mat = pat.matcher(cadena); 34 | if (mat.matches()) { 35 | System.out.println("SI"); 36 | } else { 37 | System.out.println("NO"); 38 | } 39 | } 40 | 41 | private void cadenaEmpieza(String cadena) { 42 | Pattern pat = Pattern.compile("^abc.*"); 43 | Matcher mat = pat.matcher(cadena); 44 | if (mat.matches()) { 45 | System.out.println("Válido"); 46 | } else { 47 | System.out.println("No Válido"); 48 | } 49 | } 50 | 51 | private void cadenaEmpieza2(String cadena) { 52 | Pattern pat = Pattern.compile("^[aA]bc.*"); 53 | Matcher mat = pat.matcher(cadena); 54 | if (mat.matches()) { 55 | System.out.println("SI"); 56 | } else { 57 | System.out.println("NO"); 58 | } 59 | } 60 | 61 | private void cadenaConLongitud(String cadena) { 62 | Pattern pat = Pattern.compile("[a-zA-Z]{5,10}"); 63 | Matcher mat = pat.matcher(cadena); 64 | if (mat.matches()) { 65 | System.out.println("SI"); 66 | } else { 67 | System.out.println("NO"); 68 | } 69 | } 70 | 71 | private void cadenaNoEmpiezaConLongitud(String cadena) { 72 | Pattern pat = Pattern.compile("^[^\\d].*"); 73 | Matcher mat = pat.matcher(cadena); 74 | if (mat.matches()) { 75 | System.out.println("SI"); 76 | } else { 77 | System.out.println("NO"); 78 | } 79 | } 80 | 81 | private void cadenaNoAcabaConDigito(String cadena) { 82 | Pattern pat = Pattern.compile(".*[^\\d]$"); 83 | Matcher mat = pat.matcher(cadena); 84 | if (mat.matches()) { 85 | System.out.println("SI"); 86 | } else { 87 | System.out.println("NO"); 88 | } 89 | } 90 | 91 | private void cadenaSoloTieneAoB(String cadena) { 92 | Pattern pat = Pattern.compile("(a|b)+"); 93 | Matcher mat = pat.matcher(cadena); 94 | if (mat.matches()) { 95 | System.out.println("SI"); 96 | } else { 97 | System.out.println("NO"); 98 | } 99 | } 100 | 101 | private void cadenaSoloTiene1YNoSeguidoDe2(String cadena) { 102 | Pattern pat = Pattern.compile(".*1(?!2).*"); 103 | Matcher mat = pat.matcher(cadena); 104 | if (mat.matches()) { 105 | System.out.println("SI"); 106 | } else { 107 | System.out.println("NO"); 108 | } 109 | } 110 | 111 | private void esEmailValido(String email) { 112 | Pattern pat = Pattern.compile("^[\\w-]+(\\.[\\w-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"); 113 | Matcher mat = pat.matcher(email); 114 | if(mat.find()){ 115 | System.out.println("Correo Válido"); 116 | }else{ 117 | System.out.println("Correo No Válido"); 118 | } 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /Soluciones/08-ExpresionesRegulares/src/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | public class Main { 4 | 5 | public static void main(String[] args) { 6 | ExrpesionesRegulares ex = new ExrpesionesRegulares(); 7 | ex.run(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Soluciones/09-StringPattern/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /Soluciones/09-StringPattern/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /Soluciones/09-StringPattern/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/09-StringPattern/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Soluciones/09-StringPattern/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/09-StringPattern/.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/09-StringPattern/StringPattern.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Soluciones/09-StringPattern/src/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import java.util.regex.Matcher; 6 | import java.util.regex.Pattern; 7 | 8 | public class Main { 9 | 10 | public static void main(String[] args) { 11 | // joinExample(); 12 | // splitEcample(); 13 | regexExample(); 14 | } 15 | 16 | private static void regexExample() { 17 | var texto = "Hola, que tal estas, por aquí, en clase de DAM 12345678v 12345678A caca de la vaca 12345678B"; 18 | var regex = "\\d{8}[A-Z]"; 19 | 20 | var existe = texto.matches(regex); 21 | System.out.println(existe); 22 | // Sale false, porque matches busca que la cadena completa sea esa expresión regular y reemplazarla por otra cosa 23 | var sal = texto.replaceAll(regex, "****"); 24 | System.out.println(sal); 25 | 26 | // Para operar con ellas necesitamos un motor de expresiones regulares inicializado al patron 27 | Pattern pattern = Pattern.compile(regex); // Inicia el objeto en base al patron 28 | Matcher matcher = pattern.matcher(texto); // Nos devuelve los resultados de operar con el patrḉon en el texto 29 | 30 | while (matcher.find()) { 31 | System.out.println("Full match: " + matcher.group()); 32 | } 33 | 34 | matcher = pattern.matcher(texto); 35 | var listaEncontrados = new ArrayList(); 36 | while (matcher.find()) { 37 | listaEncontrados.add(matcher.group()); 38 | } 39 | 40 | System.out.println(listaEncontrados); 41 | System.out.println(listaEncontrados.size()); 42 | 43 | 44 | // Para filtrar datos de entrada 45 | var dniBueno = "12345678A"; 46 | var dniMalo = "1234678v"; 47 | regex = "\\d{8}[A-Z]"; 48 | existe = dniBueno.matches(regex); 49 | System.out.println(existe); 50 | existe = dniMalo.matches(regex); 51 | System.out.println(existe); 52 | 53 | System.out.println(); 54 | regex = "([a-dA-D,f-gF-G])[1-8]"; 55 | var butacaBuena = "A1"; 56 | var butacaMala1 = "E9"; 57 | var butacaMala2 = "F10"; 58 | var butacaMala3 = "e2"; 59 | var butacaBuena2 = "d8"; 60 | System.out.println(butacaBuena.matches(regex)); 61 | System.out.println(butacaMala1.matches(regex)); 62 | System.out.println(butacaMala2.matches(regex)); 63 | System.out.println(butacaBuena2.matches(regex)); 64 | System.out.println(butacaMala3.matches(regex)); 65 | 66 | var butacas = "A1,A2,A3,A4,A5,A6,A7,A8,B1,B2,B3,B4,B5,B6,B7,B8,C1,C2,C3,C4,C5,C6,C7,C8,D1,D2,D3,D4,D5,D6,D7,D8,E1,E2,E3,E4,E5,E6,E7,E8,F1,F2,F3,F4,F5,F6,F7,F8,G1,G2,G3,G4,G5,G6,G7,G8"; 67 | butacas += "A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, L9, M9, N9, O9, P9, Q9, R9, S9, T9, U9, V9, W9, X9, Y9, Z9"; 68 | pattern = Pattern.compile(regex); 69 | matcher = pattern.matcher(butacas); 70 | var listaButacas = new ArrayList(); 71 | while (matcher.find()) { 72 | listaButacas.add(matcher.group()); 73 | } 74 | System.out.println(listaButacas); 75 | System.out.println(listaButacas.size()); 76 | 77 | 78 | } 79 | 80 | private static void splitEcample() { 81 | var cad = "Hola, que tal estas, por aquí, en clase de DAM"; 82 | var lista = cad.split(","); 83 | for (var s : lista) { 84 | System.out.println(s.trim()); 85 | } 86 | System.out.println(); 87 | 88 | lista = cad.split(" "); 89 | for (var s : lista) { 90 | System.out.println(s.trim()); 91 | } 92 | System.out.println(); 93 | 94 | lista = cad.split("e"); 95 | for (var s : lista) { 96 | System.out.println(s.trim()); 97 | } 98 | } 99 | 100 | private static void joinExample() { 101 | var lista = List.of("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); 102 | var sal = String.join("", lista); 103 | System.out.println(sal); 104 | sal = String.join("-", lista); 105 | System.out.println(sal); 106 | sal = String.join(";", lista); 107 | System.out.println(sal); 108 | sal = "$"+String.join("->", lista)+"$"; 109 | System.out.println(sal); 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/.gitignore: -------------------------------------------------------------------------------- 1 | /out -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/SecuenciaPaises.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/data/paises.txt: -------------------------------------------------------------------------------- 1 | 1;España;ES;Castellano;Euro;Madrid;943916.754735567 2 | 2;Francia;FR;Francés;Euro;Paris;47967.12095737543 3 | 3;Italia;IT;Italiano;Euro;Roma;283212.9167356374 4 | 4;Alemania;DE;Alemán;Euro;Berlín;295540.03296615585 5 | 5;Reino Unido;UK;Inglés;Libra;Londres;722726.6691398313 6 | 6;Japón;JP;Japonés;Yen;Tokio;415913.0535591459 7 | 7;China;CN;Chino;Yuan;Pekín;379099.78469140484 8 | 8;Australia;AU;Inglés;Dólar;Canberra;549774.2109129715 9 | 9;Argentina;AR;Español;Peso;Buenos Aires;851569.9127902453 10 | 10;Brasil;BR;Portugués;Real;Brasilia;844776.9777917415 11 | 11;Estados Unidos;US;Inglés;Dólar;Washington;588933.4321287608 12 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import es.joseluisgs.dam.views.PaisView; 4 | 5 | /** 6 | * Ejemplo de Patrón MVC para CRUD de países. 7 | * Siguiendo los diagramas de Secuencias en Clase 8 | * Modelo: Pais, gestionador por PaisRepository 9 | * Vista: La propia consola: comunicacion con el usuario 10 | * Controlador: PaisController, controla, cómo y de qué manera el modelo, repositorio y la vista interactúan 11 | * Como vista que soy, soy lo último y gestiono las excepciones con Try/Catch 12 | */ 13 | public class Main { 14 | public static void main(String[] args) { 15 | PaisView view = PaisView.getInstance(); 16 | view.menu(); 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/comparators/PaisCodigoComparator.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.comparators; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | import java.util.Comparator; 6 | 7 | /** 8 | * Comparador de países por código. 9 | */ 10 | public class PaisCodigoComparator implements Comparator { 11 | @Override 12 | public int compare(Pais p1, Pais p2) { 13 | return p1.getCodigo().compareTo(p2.getCodigo()); 14 | } 15 | 16 | @Override 17 | public Comparator reversed() { 18 | return Comparator.super.reversed(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/comparators/PaisNombreComparator.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.comparators; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | import java.util.Comparator; 6 | 7 | /** 8 | * Comparador de países por nombre. 9 | */ 10 | public class PaisNombreComparator implements Comparator { 11 | @Override 12 | public int compare(Pais p1, Pais p2) { 13 | return p1.getNombre().compareTo(p2.getNombre()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/controllers/AcuerdoController.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.controllers; 2 | 3 | import es.joseluisgs.dam.models.Acuerdo; 4 | import es.joseluisgs.dam.models.LineaAcuerdo; 5 | import es.joseluisgs.dam.models.Pais; 6 | import es.joseluisgs.dam.repositories.IAcuerdoRepository; 7 | 8 | import java.time.LocalDate; 9 | import java.time.LocalDateTime; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | public class AcuerdoController { 14 | private final IAcuerdoRepository acuerdosRepository; 15 | 16 | public AcuerdoController(IAcuerdoRepository acuerdosRepository) { 17 | this.acuerdosRepository = acuerdosRepository; 18 | } 19 | 20 | public Acuerdo crearAcuerdo(String nombre, String descripcion, List paises) { 21 | List lineas = new ArrayList<>(); 22 | for (Pais pais : paises) { 23 | lineas.add(new LineaAcuerdo(pais, LocalDate.now().getYear())); 24 | } 25 | Acuerdo acuerdo = new Acuerdo(nombre, LocalDateTime.now(), lineas); 26 | return acuerdosRepository.save(acuerdo); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/controllers/PaisController.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.controllers; 2 | 3 | import es.joseluisgs.dam.exceptions.PaisException; 4 | import es.joseluisgs.dam.models.Pais; 5 | import es.joseluisgs.dam.repositories.IPaisRepository; 6 | import es.joseluisgs.dam.services.IStoragePaises; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * Controlador de Gestion de Paises 12 | * Dependencias: PaisRepository 13 | * Es importante que lanzo las excepciones de PaisException 14 | * Que ya las recogerá la vista 15 | */ 16 | public class PaisController { 17 | // private static PaisController instance; 18 | private final IPaisRepository paisRepository; 19 | private final IStoragePaises paisStorage; 20 | 21 | // Inyección de dependencias por controlador 22 | public PaisController(IPaisRepository paisRepository, IStoragePaises paisStorage) { 23 | this.paisRepository = paisRepository; 24 | this.paisStorage = paisStorage; 25 | loadData(); 26 | } 27 | 28 | 29 | /** 30 | * Inicializa el repositorio con datos de prueba 31 | */ 32 | private void loadData() { 33 | 34 | this.paisRepository.save(new Pais("España", "ES", "Castellano", "Euro", "Madrid")); 35 | this.paisRepository.save(new Pais("Francia", "FR", "Francés", "Euro", "Paris")); 36 | this.paisRepository.save(new Pais("Italia", "IT", "Italiano", "Euro", "Roma")); 37 | this.paisRepository.save(new Pais("Alemania", "DE", "Alemán", "Euro", "Berlín")); 38 | this.paisRepository.save(new Pais("Reino Unido", "UK", "Inglés", "Libra", "Londres")); 39 | this.paisRepository.save(new Pais("Japón", "JP", "Japonés", "Yen", "Tokio")); 40 | this.paisRepository.save(new Pais("China", "CN", "Chino", "Yuan", "Pekín")); 41 | this.paisRepository.save(new Pais("Australia", "AU", "Inglés", "Dólar", "Canberra")); 42 | this.paisRepository.save(new Pais("Argentina", "AR", "Español", "Peso", "Buenos Aires")); 43 | this.paisRepository.save(new Pais("Brasil", "BR", "Portugués", "Real", "Brasilia")); 44 | this.paisRepository.save(new Pais("Estados Unidos", "US", "Inglés", "Dólar", "Washington")); 45 | 46 | } 47 | 48 | public Pais crearPais(Pais pais) throws PaisException { 49 | // Comprobamos que no haya datos incorrectos, por si ha fallado la interfaz 50 | checkPaisData(pais); 51 | // comprobamos si existe 52 | var existe = paisRepository.findByNombre(pais.getNombre()); 53 | if (existe == null) { 54 | paisRepository.save(pais); 55 | return pais; 56 | 57 | } 58 | throw new PaisException("Ya existe un pais con el nombre " + pais.getNombre()); 59 | } 60 | 61 | /** 62 | * Comprueba que los datos del pais son correctos. No lo hacemos en el modelo para no contaminarlo. 63 | * 64 | * @param pais Pais a comprobar 65 | * @throws PaisException Si los datos son incorrectos 66 | */ 67 | private void checkPaisData(Pais pais) throws PaisException { 68 | if (pais.getNombre() == null || pais.getNombre().trim().isEmpty()) { 69 | throw new PaisException("El nombre del pais no puede estar vacio"); 70 | } 71 | if (pais.getCodigo() == null || pais.getCodigo().trim().isEmpty()) { 72 | throw new PaisException("El codigo del pais no puede estar vacio"); 73 | } 74 | if (pais.getIdioma() == null || pais.getIdioma().trim().isEmpty()) { 75 | throw new PaisException("El idioma del pais no puede estar vacio"); 76 | } 77 | if (pais.getMoneda() == null || pais.getMoneda().trim().isEmpty()) { 78 | throw new PaisException("La moneda del pais no puede estar vacia"); 79 | } 80 | if (pais.getCapital() == null || pais.getCapital().trim().isEmpty()) { 81 | throw new PaisException("La capital del pais no puede estar vacia"); 82 | } 83 | } 84 | 85 | /** 86 | * Devuelve el pais con el nombre indicado 87 | * 88 | * @param nombre nombre del pais 89 | * @return Pais con el nombre indicado 90 | * @throws PaisException si no existe el pais 91 | */ 92 | public Pais getPaisByNombre(String nombre) throws PaisException { 93 | var pais = paisRepository.findByNombre(nombre); 94 | if (pais != null) { 95 | return pais; 96 | } 97 | throw new PaisException("No existe el pais con nombre " + nombre); 98 | } 99 | 100 | /** 101 | * Devuelve el pais con el id indicado 102 | * 103 | * @param id id del pais 104 | * @return Pais con el id indicado 105 | * @throws PaisException si no existe el pais 106 | */ 107 | public Pais getPaisById(int id) throws PaisException { 108 | var pais = paisRepository.findById(id); 109 | if (pais != null) { 110 | return pais; 111 | } 112 | throw new PaisException("No existe el pais con id " + id); 113 | } 114 | 115 | /** 116 | * Devuelve todos los paises 117 | * 118 | * @return Lista de paises 119 | */ 120 | public List getAllPaises() { 121 | return paisRepository.findAll(); 122 | } 123 | 124 | public Pais updatePais(int id, Pais pais) throws PaisException { 125 | // Comprobamos los datos 126 | checkPaisData(pais); 127 | // Vemos si con los datos nuevos existe un pais que se llame igual 128 | var otro = paisRepository.findByNombre(pais.getNombre()); 129 | // si no existe otro pais con el mismo nombre, actualizamos 130 | // o si simplemente los id son iguales, actualizamos, pues somos el mismo objeto, por eso hay "otro" ya 131 | // si no lo entiendes dale la vuelta al if 132 | if ((otro == null) || (otro.getId() == pais.getId())) { 133 | // si no existe otro pais con el mismo nombre, lo actualizamos o somos nosotros por id 134 | paisRepository.update(id, pais); 135 | return pais; 136 | } else { 137 | throw new PaisException("Ya existe un pais con el nombre " + pais.getNombre()); 138 | } 139 | } 140 | 141 | /** 142 | * Elimina el pais con el nombre indicado 143 | * 144 | * @param nombre nombre del pais 145 | * @return Pais eliminado 146 | * @throws PaisException si no existe el pais 147 | */ 148 | public Pais deletePais(String nombre) throws PaisException { 149 | var pais = paisRepository.findByNombre(nombre); 150 | if (pais != null) { 151 | // paisRepository.deleteById(pais.getId()); 152 | paisRepository.delete(pais.getId()); 153 | return pais; 154 | } else { 155 | throw new PaisException("No existe el pais con nombre " + nombre); 156 | } 157 | } 158 | 159 | /** 160 | * Importa los datos desde un fichero de backup 161 | */ 162 | public void importarDatos() { 163 | System.out.println("Importando datos de paises..."); 164 | System.out.println("Importando desde: " + paisStorage.getStoragePath()); 165 | var lista = paisStorage.load(); 166 | if (lista.size() > 0) { 167 | paisRepository.clearAll(); 168 | for (Pais pais : lista) { 169 | // pais 170 | paisRepository.save(pais); 171 | } 172 | System.out.println("Datos importados con éxito al repositorio: " + lista.size() + " paises"); 173 | } else { 174 | System.out.println("Ha existido un problema al importar los datos"); 175 | } 176 | } 177 | 178 | /** 179 | * Exporta los datos desde un fichero de Backup 180 | */ 181 | public void exportarDatos() { 182 | System.out.println("Exportando datos de paises..."); 183 | var res = paisStorage.save(paisRepository.findAll()); 184 | if (res) { 185 | System.out.println("Datos exportados con éxito en: " + paisStorage.getStoragePath()); 186 | } else { 187 | System.out.println("Ha existido un problema al exportar los datos"); 188 | } 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/exceptions/PaisException.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.exceptions; 2 | 3 | /** 4 | * Excepción asociada al comprotamiento de gestion de paises. 5 | */ 6 | public class PaisException extends Exception { 7 | 8 | public PaisException(String mensaje) { 9 | super(mensaje); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/models/Acuerdo.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.models; 2 | 3 | import es.joseluisgs.dam.utils.Formatter; 4 | 5 | import java.time.LocalDateTime; 6 | import java.util.List; 7 | 8 | public class Acuerdo { 9 | private static int contador = 0; 10 | private final int id; 11 | private final String nombre; 12 | private final LocalDateTime fecha; 13 | private final List lineas; 14 | 15 | public Acuerdo(String nombre, LocalDateTime fecha, List lineas) { 16 | this.id = ++contador; 17 | this.nombre = nombre; 18 | this.fecha = fecha; 19 | this.lineas = lineas; 20 | } 21 | 22 | public Integer getId() { 23 | return id; 24 | } 25 | 26 | @Override 27 | public String toString() { 28 | // Puedes imprimir listas como Arrays.toString(lista)) 29 | return "Acuerdo{" + "id=" + id + ", nombre=" + nombre + ", fecha=" 30 | + Formatter.dateParser(fecha) + ", lineas=" + lineas + '}'; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/models/LineaAcuerdo.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.models; 2 | 3 | public class LineaAcuerdo { 4 | private final Pais pais; 5 | private final int año; 6 | 7 | public LineaAcuerdo(Pais pais, int año) { 8 | this.pais = pais; 9 | this.año = año; 10 | } 11 | 12 | @Override 13 | public String toString() { 14 | return "LineaAcuerdo{" + "pais=" + pais.getNombre() + ", año=" + año + '}'; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/models/Pais.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.models; 2 | 3 | import es.joseluisgs.dam.utils.Formatter; 4 | 5 | import java.util.Objects; 6 | 7 | /** 8 | * Modelo. Clase que representa un país. POJO. 9 | * Se hace lo más limpia posible para que sirva a numerosos casos. No se implementa excepciones ni comparables 10 | * Es un POJO de "libro" 11 | */ 12 | public class Pais { 13 | private static int contador = 0; 14 | private final int id; 15 | private String nombre; 16 | private String codigo; 17 | private String idioma; 18 | private String moneda; 19 | private String capital; 20 | private double presupuesto; 21 | 22 | public Pais() { 23 | this.id = ++contador; 24 | } 25 | 26 | public Pais(String nombre, String codigo, String idioma, String moneda, String capital) { 27 | this.id = ++contador; 28 | this.nombre = nombre; 29 | this.codigo = codigo; 30 | this.idioma = idioma; 31 | this.moneda = moneda; 32 | this.capital = capital; 33 | // Voy a dejar el presupuesto aleatorio 34 | this.presupuesto = Math.random() * 1000000; 35 | } 36 | 37 | // Para el clone... 38 | private Pais(int id, String nombre, String codigo, String idioma, String moneda, String capital) { 39 | this.id = id; 40 | this.nombre = nombre; 41 | this.codigo = codigo; 42 | this.idioma = idioma; 43 | this.moneda = moneda; 44 | this.capital = capital; 45 | } 46 | 47 | public Pais(int id, String nombre, String codigo, String idioma, String moneda, String capital, double presupuesto) { 48 | this.id = id; 49 | this.nombre = nombre; 50 | this.codigo = codigo; 51 | this.idioma = idioma; 52 | this.moneda = moneda; 53 | this.capital = capital; 54 | this.presupuesto = presupuesto; 55 | } 56 | 57 | public int getId() { 58 | return id; 59 | } 60 | 61 | 62 | public String getNombre() { 63 | return nombre; 64 | } 65 | 66 | public void setNombre(String nombre) { 67 | this.nombre = nombre; 68 | } 69 | 70 | public String getCodigo() { 71 | return codigo; 72 | } 73 | 74 | public void setCodigo(String codigo) { 75 | this.codigo = codigo; 76 | } 77 | 78 | public String getIdioma() { 79 | return idioma; 80 | } 81 | 82 | public void setIdioma(String idioma) { 83 | this.idioma = idioma; 84 | } 85 | 86 | public String getMoneda() { 87 | return moneda; 88 | } 89 | 90 | public void setMoneda(String moneda) { 91 | this.moneda = moneda; 92 | } 93 | 94 | public String getCapital() { 95 | return capital; 96 | } 97 | 98 | public void setCapital(String capital) { 99 | this.capital = capital; 100 | } 101 | 102 | @Override 103 | public String toString() { 104 | return "Pais{" + "id=" + id + ", nombre=" + nombre + ", codigo=" + codigo + ", idioma=" + idioma + ", moneda=" + moneda + ", capital=" + capital + ", presupuesto=" + Formatter.moneyParser(presupuesto) + '}'; 105 | } 106 | 107 | 108 | public Pais nombre(String nombre) { 109 | this.nombre = nombre; 110 | return this; 111 | } 112 | 113 | public Pais codigo(String codigo) { 114 | this.codigo = codigo; 115 | return this; 116 | } 117 | 118 | public Pais idioma(String idioma) { 119 | this.idioma = idioma; 120 | return this; 121 | } 122 | 123 | public Pais moneda(String moneda) { 124 | this.moneda = moneda; 125 | return this; 126 | } 127 | 128 | public Pais capital(String capital) { 129 | this.capital = capital; 130 | return this; 131 | } 132 | 133 | public String presupuesto() { 134 | return Formatter.moneyParser(presupuesto); 135 | } 136 | 137 | @Override 138 | public boolean equals(Object o) { 139 | if (this == o) return true; 140 | if (!(o instanceof Pais)) return false; 141 | Pais pais = (Pais) o; 142 | return id == pais.id && nombre.equals(pais.nombre) && codigo.equals(pais.codigo) && idioma.equals(pais.idioma) && moneda.equals(pais.moneda) && capital.equals(pais.capital); 143 | } 144 | 145 | @Override 146 | public int hashCode() { 147 | return Objects.hash(id, nombre, codigo, idioma, moneda, capital); 148 | } 149 | 150 | @Override 151 | public Pais clone() { 152 | return new Pais(this.id, this.nombre, this.codigo, this.idioma, this.moneda, this.capital); 153 | } 154 | 155 | public String toString(String separator) { 156 | return id + separator + nombre + separator + codigo + separator + idioma + separator + moneda + separator + capital + separator + presupuesto; 157 | } 158 | } 159 | 160 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/repositories/AcuerdoRepository.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.repositories; 2 | 3 | import es.joseluisgs.dam.models.Acuerdo; 4 | 5 | import java.util.ArrayList; 6 | import java.util.HashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | public class AcuerdoRepository implements IAcuerdoRepository { 11 | private final Map acuerdos = new HashMap<>(); 12 | 13 | 14 | @Override 15 | public List findAll() { 16 | return new ArrayList<>(this.acuerdos.values()); 17 | } 18 | 19 | @Override 20 | public Acuerdo findById(Integer id) { 21 | return this.acuerdos.get(id); 22 | } 23 | 24 | @Override 25 | public Acuerdo save(Acuerdo entity) { 26 | this.acuerdos.put(entity.getId(), entity); 27 | return entity; 28 | } 29 | 30 | @Override 31 | public Acuerdo update(Integer id, Acuerdo entity) { 32 | this.acuerdos.put(id, entity); 33 | return entity; 34 | } 35 | 36 | @Override 37 | public Acuerdo delete(Integer id) { 38 | return this.acuerdos.remove(id); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/repositories/CRUDRepository.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.repositories; 2 | 3 | import java.util.List; 4 | 5 | // posteriormente lo cambiaré a Optional.... 6 | public interface CRUDRepository { 7 | List findAll(); 8 | 9 | T findById(ID id); 10 | 11 | T save(T entity); 12 | 13 | T update(ID id, T entity); 14 | 15 | T delete(ID id); 16 | } 17 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/repositories/IAcuerdoRepository.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.repositories; 2 | 3 | import es.joseluisgs.dam.models.Acuerdo; 4 | 5 | public interface IAcuerdoRepository extends CRUDRepository { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/repositories/IPaisRepository.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.repositories; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | // Toda nueva funcionalidad se extiende de la interfaz SOLID 6 | public interface IPaisRepository extends CRUDRepository { 7 | 8 | Pais findByNombre(String nombre); 9 | 10 | void clearAll(); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/repositories/PaisRepository.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.repositories; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | import java.util.TreeMap; 8 | 9 | /** 10 | * Repository para los paises siguiendo el TDA Mapa 11 | * Voy a usar un mapa y meteré la clave que es el ID 12 | * Con esto vemos lo sencillo que es usar mapas para este tipo de aplicaciones CRUD 13 | * Si lo hacemos bien, solo debo tocar el repositorio, porque tengo un buen diseño de capas 14 | */ 15 | public class PaisRepository implements IPaisRepository { 16 | private final TreeMap paises = new TreeMap<>(); 17 | 18 | /** 19 | * Busca un pais por su nombre 20 | * 21 | * @param nombre nombre del pais 22 | * @return el pais encontrado o null si no lo encuentra 23 | */ 24 | public Pais findByNombre(String nombre) { 25 | for (Pais pais : this.paises.values()) { 26 | if (pais.getNombre().equals(nombre)) 27 | return pais; 28 | } 29 | return null; 30 | } 31 | 32 | /** 33 | * Busca un pais por su id 34 | * 35 | * @param id id del pais 36 | * @return el pais encontrado o null si no lo encuentra 37 | */ 38 | @Override 39 | public Pais findById(Integer id) { 40 | return this.paises.get(id); 41 | } 42 | 43 | /** 44 | * Devuelve todos los paises 45 | * 46 | * @return lista de paises 47 | */ 48 | @Override 49 | public List findAll() { 50 | return new ArrayList<>(this.paises.values()); 51 | } 52 | 53 | /** 54 | * Añade un pais 55 | * 56 | * @param pais pais a añadir 57 | */ 58 | @Override 59 | public Pais save(Pais pais) { 60 | this.paises.put(pais.getId(), pais); 61 | return pais; 62 | } 63 | 64 | /** 65 | * Actualiza un pais 66 | * 67 | * @param id id del pais a actualizar 68 | * @param pais pais con los nuevos datos 69 | * @return el pais actualizado 70 | */ 71 | @Override 72 | public Pais update(Integer id, Pais pais) { 73 | this.paises.put(id, pais); 74 | return pais; 75 | } 76 | 77 | /** 78 | * Elimina un pais dado el id 79 | * 80 | * @param id id del pais a eliminar 81 | * @return el pais eliminado o null si no lo encuentra 82 | */ 83 | @Override 84 | public Pais delete(Integer id) { 85 | return this.paises.remove(id); 86 | } 87 | 88 | @Override 89 | public void clearAll() { 90 | this.paises.clear(); 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/services/IStorage.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.services; 2 | 3 | public interface IStorage { 4 | boolean save(T lista); 5 | 6 | T load(); 7 | 8 | String getStoragePath(); 9 | } 10 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/services/IStoragePaises.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.services; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | import java.util.List; 6 | 7 | public interface IStoragePaises extends IStorage> { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/services/StoragePaisesCSVFile.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.services; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | import java.io.*; 6 | import java.nio.file.Files; 7 | import java.nio.file.Path; 8 | import java.nio.file.Paths; 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class StoragePaisesCSVFile implements IStoragePaises { 13 | private final Path currentRelativePath = Paths.get(""); 14 | private final String ruta = currentRelativePath.toAbsolutePath().toString(); 15 | private final String dir = ruta + File.separator + "data"; 16 | private final String paisesFile = dir + File.separator + "paises.txt"; 17 | private final String fieldSeparator = ";"; 18 | 19 | public StoragePaisesCSVFile() { 20 | init(); 21 | } 22 | 23 | private void init() { 24 | Path path = Paths.get(dir); 25 | if (!Files.exists(path)) { 26 | try { 27 | Files.createDirectories(path); 28 | } catch (IOException e) { 29 | System.out.println("Error: " + e.getMessage()); 30 | } 31 | } 32 | } 33 | 34 | @Override 35 | public boolean save(List lista) { 36 | PrintWriter f = null; 37 | boolean result = false; 38 | try { 39 | f = new PrintWriter(new FileWriter(paisesFile)); 40 | 41 | for (var pais : lista) { 42 | f.println(pais.toString(fieldSeparator)); 43 | } 44 | 45 | result = true; 46 | 47 | } catch (Exception e) { 48 | System.out.println("Error: " + e.getMessage()); 49 | } finally { 50 | if (f != null) { 51 | f.close(); 52 | } 53 | } 54 | return result; 55 | } 56 | 57 | @Override 58 | public List load() { 59 | File fichero; 60 | BufferedReader f = null; 61 | List lista = new ArrayList<>(); 62 | try { 63 | fichero = new File(paisesFile); 64 | f = new BufferedReader(new FileReader(fichero)); 65 | 66 | String linea; 67 | while ((linea = f.readLine()) != null) { 68 | lista.add(getPais(linea)); 69 | } 70 | 71 | } catch (Exception e) { 72 | System.out.println("Error: " + e.getMessage()); 73 | } finally { 74 | if (f != null) { 75 | try { 76 | f.close(); 77 | } catch (IOException e) { 78 | System.out.println("Error: " + e.getMessage()); 79 | } 80 | } 81 | } 82 | return lista; 83 | } 84 | 85 | private Pais getPais(String linea) { 86 | String[] campos = linea.split(fieldSeparator); 87 | return new Pais( 88 | Integer.parseInt(campos[0]), 89 | campos[1], 90 | campos[2], 91 | campos[3], 92 | campos[4], 93 | campos[5], 94 | Double.parseDouble(campos[6]) 95 | ); 96 | } 97 | 98 | @Override 99 | public String getStoragePath() { 100 | return paisesFile; 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/utils/Console.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.utils; 2 | 3 | import java.util.Scanner; 4 | 5 | /** 6 | * Clase que permite leer datos desde la consola. 7 | */ 8 | public class Console { 9 | public static String getString(String message) { 10 | System.out.println(message); 11 | return new Scanner(System.in).nextLine().trim(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Soluciones/10-MVC-Paises-FicherosTexto/src/es/joseluisgs/dam/utils/Formatter.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.utils; 2 | 3 | import java.text.NumberFormat; 4 | import java.time.LocalDateTime; 5 | import java.time.format.DateTimeFormatter; 6 | import java.time.format.FormatStyle; 7 | import java.util.Locale; 8 | 9 | public class Formatter { 10 | 11 | public static String dateParser(LocalDateTime date) { 12 | final Locale locale = new Locale("es", "ES"); 13 | // private String pattern = "dd/MM/yyyy"; 14 | return date.format(DateTimeFormatter 15 | .ofLocalizedDate(FormatStyle.MEDIUM).withLocale(locale)); 16 | } 17 | 18 | public static String moneyParser(Double money) { 19 | final Locale locale = new Locale("es", "ES"); 20 | return NumberFormat.getCurrencyInstance(locale).format(money); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.gitignore: -------------------------------------------------------------------------------- 1 | /out -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.idea/libraries/Maven__com_google_code_gson_gson_2_9_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/SecuenciaPaises.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/data/paises.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "nombre": "España", 5 | "codigo": "ES", 6 | "idioma": "Castellano", 7 | "moneda": "Euro", 8 | "capital": "Madrid", 9 | "presupuesto": 457307.0675323584 10 | }, 11 | { 12 | "id": 2, 13 | "nombre": "Francia", 14 | "codigo": "FR", 15 | "idioma": "Francés", 16 | "moneda": "Euro", 17 | "capital": "Paris", 18 | "presupuesto": 56288.76702345964 19 | }, 20 | { 21 | "id": 3, 22 | "nombre": "Italia", 23 | "codigo": "IT", 24 | "idioma": "Italiano", 25 | "moneda": "Euro", 26 | "capital": "Roma", 27 | "presupuesto": 652526.7283301865 28 | }, 29 | { 30 | "id": 4, 31 | "nombre": "Alemania", 32 | "codigo": "DE", 33 | "idioma": "Alemán", 34 | "moneda": "Euro", 35 | "capital": "Berlín", 36 | "presupuesto": 619215.9568885077 37 | }, 38 | { 39 | "id": 5, 40 | "nombre": "Reino Unido", 41 | "codigo": "UK", 42 | "idioma": "Inglés", 43 | "moneda": "Libra", 44 | "capital": "Londres", 45 | "presupuesto": 66017.01432463137 46 | }, 47 | { 48 | "id": 6, 49 | "nombre": "Japón", 50 | "codigo": "JP", 51 | "idioma": "Japonés", 52 | "moneda": "Yen", 53 | "capital": "Tokio", 54 | "presupuesto": 594982.9421673003 55 | }, 56 | { 57 | "id": 7, 58 | "nombre": "China", 59 | "codigo": "CN", 60 | "idioma": "Chino", 61 | "moneda": "Yuan", 62 | "capital": "Pekín", 63 | "presupuesto": 967614.8528164269 64 | }, 65 | { 66 | "id": 8, 67 | "nombre": "Australia", 68 | "codigo": "AU", 69 | "idioma": "Inglés", 70 | "moneda": "Dólar", 71 | "capital": "Canberra", 72 | "presupuesto": 962915.8095743732 73 | }, 74 | { 75 | "id": 9, 76 | "nombre": "Argentina", 77 | "codigo": "AR", 78 | "idioma": "Español", 79 | "moneda": "Peso", 80 | "capital": "Buenos Aires", 81 | "presupuesto": 430742.56749092956 82 | }, 83 | { 84 | "id": 10, 85 | "nombre": "Brasil", 86 | "codigo": "BR", 87 | "idioma": "Portugués", 88 | "moneda": "Real", 89 | "capital": "Brasilia", 90 | "presupuesto": 995036.5600726294 91 | }, 92 | { 93 | "id": 11, 94 | "nombre": "Estados Unidos", 95 | "codigo": "US", 96 | "idioma": "Inglés", 97 | "moneda": "Dólar", 98 | "capital": "Washington", 99 | "presupuesto": 456458.26281332836 100 | }, 101 | { 102 | "id": 99, 103 | "nombre": "Los Pepes", 104 | "codigo": "PE", 105 | "idioma": "Peperoni", 106 | "moneda": "Pepelor", 107 | "capital": "Pepilandia", 108 | "presupuesto": 666.000 109 | } 110 | ] 111 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | groupId 8 | SecuenciaPaises 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 11 13 | 11 14 | 15 | 16 | 17 | 18 | 19 | com.google.code.gson 20 | gson 21 | 2.9.0 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import es.joseluisgs.dam.views.PaisView; 4 | 5 | /** 6 | * Ejemplo de Patrón MVC para CRUD de países. 7 | * Siguiendo los diagramas de Secuencias en Clase 8 | * Modelo: Pais, gestionador por PaisRepository 9 | * Vista: La propia consola: comunicacion con el usuario 10 | * Controlador: PaisController, controla, cómo y de qué manera el modelo, repositorio y la vista interactúan 11 | * Como vista que soy, soy lo último y gestiono las excepciones con Try/Catch 12 | */ 13 | public class Main { 14 | public static void main(String[] args) { 15 | PaisView view = PaisView.getInstance(); 16 | view.menu(); 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/comparators/PaisCodigoComparator.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.comparators; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | import java.util.Comparator; 6 | 7 | /** 8 | * Comparador de países por código. 9 | */ 10 | public class PaisCodigoComparator implements Comparator { 11 | @Override 12 | public int compare(Pais p1, Pais p2) { 13 | return p1.getCodigo().compareTo(p2.getCodigo()); 14 | } 15 | 16 | @Override 17 | public Comparator reversed() { 18 | return Comparator.super.reversed(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/comparators/PaisNombreComparator.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.comparators; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | import java.util.Comparator; 6 | 7 | /** 8 | * Comparador de países por nombre. 9 | */ 10 | public class PaisNombreComparator implements Comparator { 11 | @Override 12 | public int compare(Pais p1, Pais p2) { 13 | return p1.getNombre().compareTo(p2.getNombre()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/controllers/AcuerdoController.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.controllers; 2 | 3 | import es.joseluisgs.dam.models.Acuerdo; 4 | import es.joseluisgs.dam.models.LineaAcuerdo; 5 | import es.joseluisgs.dam.models.Pais; 6 | import es.joseluisgs.dam.repositories.IAcuerdoRepository; 7 | 8 | import java.time.LocalDate; 9 | import java.time.LocalDateTime; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | public class AcuerdoController { 14 | private final IAcuerdoRepository acuerdosRepository; 15 | 16 | public AcuerdoController(IAcuerdoRepository acuerdosRepository) { 17 | this.acuerdosRepository = acuerdosRepository; 18 | } 19 | 20 | public Acuerdo crearAcuerdo(String nombre, String descripcion, List paises) { 21 | List lineas = new ArrayList<>(); 22 | for (Pais pais : paises) { 23 | lineas.add(new LineaAcuerdo(pais, LocalDate.now().getYear())); 24 | } 25 | Acuerdo acuerdo = new Acuerdo(nombre, LocalDateTime.now(), lineas); 26 | return acuerdosRepository.save(acuerdo); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/controllers/PaisController.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.controllers; 2 | 3 | import es.joseluisgs.dam.exceptions.PaisException; 4 | import es.joseluisgs.dam.models.Pais; 5 | import es.joseluisgs.dam.repositories.IPaisRepository; 6 | import es.joseluisgs.dam.services.IStoragePaises; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * Controlador de Gestion de Paises 12 | * Dependencias: PaisRepository 13 | * Es importante que lanzo las excepciones de PaisException 14 | * Que ya las recogerá la vista 15 | */ 16 | public class PaisController { 17 | // private static PaisController instance; 18 | private final IPaisRepository paisRepository; 19 | private final IStoragePaises paisStorage; 20 | 21 | // Inyección de dependencias por controlador 22 | public PaisController(IPaisRepository paisRepository, IStoragePaises paisStorage) { 23 | this.paisRepository = paisRepository; 24 | this.paisStorage = paisStorage; 25 | loadData(); 26 | } 27 | 28 | 29 | /** 30 | * Singleton pattern implementation, aunque acoplamos aquí lo podemos quotar en cualquier momento 31 | * 32 | * @return instance of PaisController 33 | */ 34 | /*public static PaisController getInstance(IPaisRepository paisRepository) { 35 | if (instance == null) { 36 | instance = new PaisController(paisRepository); 37 | } 38 | return instance; 39 | }*/ 40 | 41 | 42 | /** 43 | * Inicializa el repositorio con datos de prueba 44 | */ 45 | private void loadData() { 46 | 47 | this.paisRepository.save(new Pais("España", "ES", "Castellano", "Euro", "Madrid")); 48 | this.paisRepository.save(new Pais("Francia", "FR", "Francés", "Euro", "Paris")); 49 | this.paisRepository.save(new Pais("Italia", "IT", "Italiano", "Euro", "Roma")); 50 | this.paisRepository.save(new Pais("Alemania", "DE", "Alemán", "Euro", "Berlín")); 51 | this.paisRepository.save(new Pais("Reino Unido", "UK", "Inglés", "Libra", "Londres")); 52 | this.paisRepository.save(new Pais("Japón", "JP", "Japonés", "Yen", "Tokio")); 53 | this.paisRepository.save(new Pais("China", "CN", "Chino", "Yuan", "Pekín")); 54 | this.paisRepository.save(new Pais("Australia", "AU", "Inglés", "Dólar", "Canberra")); 55 | this.paisRepository.save(new Pais("Argentina", "AR", "Español", "Peso", "Buenos Aires")); 56 | this.paisRepository.save(new Pais("Brasil", "BR", "Portugués", "Real", "Brasilia")); 57 | this.paisRepository.save(new Pais("Estados Unidos", "US", "Inglés", "Dólar", "Washington")); 58 | 59 | } 60 | 61 | public Pais crearPais(Pais pais) throws PaisException { 62 | // Comprobamos que no haya datos incorrectos, por si ha fallado la interfaz 63 | checkPaisData(pais); 64 | // comprobamos si existe 65 | var existe = paisRepository.findByNombre(pais.getNombre()); 66 | if (existe == null) { 67 | paisRepository.save(pais); 68 | return pais; 69 | 70 | } 71 | throw new PaisException("Ya existe un pais con el nombre " + pais.getNombre()); 72 | } 73 | 74 | /** 75 | * Comprueba que los datos del pais son correctos. No lo hacemos en el modelo para no contaminarlo. 76 | * 77 | * @param pais Pais a comprobar 78 | * @throws PaisException Si los datos son incorrectos 79 | */ 80 | private void checkPaisData(Pais pais) throws PaisException { 81 | if (pais.getNombre() == null || pais.getNombre().trim().isEmpty()) { 82 | throw new PaisException("El nombre del pais no puede estar vacio"); 83 | } 84 | if (pais.getCodigo() == null || pais.getCodigo().trim().isEmpty()) { 85 | throw new PaisException("El codigo del pais no puede estar vacio"); 86 | } 87 | if (pais.getIdioma() == null || pais.getIdioma().trim().isEmpty()) { 88 | throw new PaisException("El idioma del pais no puede estar vacio"); 89 | } 90 | if (pais.getMoneda() == null || pais.getMoneda().trim().isEmpty()) { 91 | throw new PaisException("La moneda del pais no puede estar vacia"); 92 | } 93 | if (pais.getCapital() == null || pais.getCapital().trim().isEmpty()) { 94 | throw new PaisException("La capital del pais no puede estar vacia"); 95 | } 96 | } 97 | 98 | /** 99 | * Devuelve el pais con el nombre indicado 100 | * 101 | * @param nombre nombre del pais 102 | * @return Pais con el nombre indicado 103 | * @throws PaisException si no existe el pais 104 | */ 105 | public Pais getPaisByNombre(String nombre) throws PaisException { 106 | var pais = paisRepository.findByNombre(nombre); 107 | if (pais != null) { 108 | return pais; 109 | } 110 | throw new PaisException("No existe el pais con nombre " + nombre); 111 | } 112 | 113 | /** 114 | * Devuelve el pais con el id indicado 115 | * 116 | * @param id id del pais 117 | * @return Pais con el id indicado 118 | * @throws PaisException si no existe el pais 119 | */ 120 | public Pais getPaisById(int id) throws PaisException { 121 | var pais = paisRepository.findById(id); 122 | if (pais != null) { 123 | return pais; 124 | } 125 | throw new PaisException("No existe el pais con id " + id); 126 | } 127 | 128 | /** 129 | * Devuelve todos los paises 130 | * 131 | * @return Lista de paises 132 | */ 133 | public List getAllPaises() { 134 | return paisRepository.findAll(); 135 | } 136 | 137 | public Pais updatePais(int id, Pais pais) throws PaisException { 138 | // Comprobamos los datos 139 | checkPaisData(pais); 140 | // Vemos si con los datos nuevos existe un pais que se llame igual 141 | var otro = paisRepository.findByNombre(pais.getNombre()); 142 | // si no existe otro pais con el mismo nombre, actualizamos 143 | // o si simplemente los id son iguales, actualizamos, pues somos el mismo objeto, por eso hay "otro" ya 144 | // si no lo entiendes dale la vuelta al if 145 | if ((otro == null) || (otro.getId() == pais.getId())) { 146 | // si no existe otro pais con el mismo nombre, lo actualizamos o somos nosotros por id 147 | paisRepository.update(id, pais); 148 | return pais; 149 | } else { 150 | throw new PaisException("Ya existe un pais con el nombre " + pais.getNombre()); 151 | } 152 | } 153 | 154 | /** 155 | * Elimina el pais con el nombre indicado 156 | * 157 | * @param nombre nombre del pais 158 | * @return Pais eliminado 159 | * @throws PaisException si no existe el pais 160 | */ 161 | public Pais deletePais(String nombre) throws PaisException { 162 | var pais = paisRepository.findByNombre(nombre); 163 | if (pais != null) { 164 | // paisRepository.deleteById(pais.getId()); 165 | paisRepository.delete(pais.getId()); 166 | return pais; 167 | } else { 168 | throw new PaisException("No existe el pais con nombre " + nombre); 169 | } 170 | } 171 | 172 | /** 173 | * Importa los datos desde un fichero de backup 174 | */ 175 | public void importarDatos() { 176 | System.out.println("Importando datos de paises..."); 177 | System.out.println("Importando desde: " + paisStorage.getStoragePath()); 178 | var lista = paisStorage.load(); 179 | if (lista.size() > 0) { 180 | paisRepository.clearAll(); 181 | for (Pais pais : lista) { 182 | // pais 183 | paisRepository.save(pais); 184 | } 185 | System.out.println("Datos importados con éxito al repositorio: " + lista.size() + " paises"); 186 | } else { 187 | System.out.println("Ha existido un problema al importar los datos"); 188 | } 189 | } 190 | 191 | /** 192 | * Exporta los datos desde un fichero de Backup 193 | */ 194 | public void exportarDatos() { 195 | System.out.println("Exportando datos de paises..."); 196 | var lista = paisRepository.findAll(); 197 | var res = paisStorage.save(lista); 198 | if (res) { 199 | System.out.println("Datos exportados con éxito en: " + paisStorage.getStoragePath() + "\nTotal paises: " + lista.size()); 200 | } else { 201 | System.out.println("Ha existido un problema al exportar los datos"); 202 | } 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/exceptions/PaisException.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.exceptions; 2 | 3 | /** 4 | * Excepción asociada al comprotamiento de gestion de paises. 5 | */ 6 | public class PaisException extends Exception { 7 | 8 | public PaisException(String mensaje) { 9 | super(mensaje); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/models/Acuerdo.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.models; 2 | 3 | import es.joseluisgs.dam.utils.Formatter; 4 | 5 | import java.time.LocalDateTime; 6 | import java.util.List; 7 | 8 | public class Acuerdo { 9 | private static int contador = 0; 10 | private final int id; 11 | private final String nombre; 12 | private final LocalDateTime fecha; 13 | private final List lineas; 14 | 15 | public Acuerdo(String nombre, LocalDateTime fecha, List lineas) { 16 | this.id = ++contador; 17 | this.nombre = nombre; 18 | this.fecha = fecha; 19 | this.lineas = lineas; 20 | } 21 | 22 | public Integer getId() { 23 | return id; 24 | } 25 | 26 | @Override 27 | public String toString() { 28 | // Puedes imprimir listas como Arrays.toString(lista)) 29 | return "Acuerdo{" + "id=" + id + ", nombre=" + nombre + ", fecha=" 30 | + Formatter.dateParser(fecha) + ", lineas=" + lineas + '}'; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/models/LineaAcuerdo.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.models; 2 | 3 | public class LineaAcuerdo { 4 | private final Pais pais; 5 | private final int año; 6 | 7 | public LineaAcuerdo(Pais pais, int año) { 8 | this.pais = pais; 9 | this.año = año; 10 | } 11 | 12 | @Override 13 | public String toString() { 14 | return "LineaAcuerdo{" + "pais=" + pais.getNombre() + ", año=" + año + '}'; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/models/Pais.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.models; 2 | 3 | import es.joseluisgs.dam.utils.Formatter; 4 | 5 | import java.io.Serializable; 6 | import java.util.Objects; 7 | 8 | /** 9 | * Modelo. Clase que representa un país. POJO. 10 | * Se hace lo más limpia posible para que sirva a numerosos casos. No se implementa excepciones ni comparables 11 | * Es un POJO de "libro" 12 | */ 13 | public class Pais implements Serializable { 14 | private static final long serialVersionUID = -87908723585899098L; 15 | 16 | private static int contador = 0; 17 | private final int id; 18 | private String nombre; 19 | private String codigo; 20 | private String idioma; 21 | private String moneda; 22 | private String capital; 23 | private double presupuesto; 24 | 25 | public Pais() { 26 | this.id = ++contador; 27 | } 28 | 29 | public Pais(String nombre, String codigo, String idioma, String moneda, String capital) { 30 | this.id = ++contador; 31 | this.nombre = nombre; 32 | this.codigo = codigo; 33 | this.idioma = idioma; 34 | this.moneda = moneda; 35 | this.capital = capital; 36 | // Voy a dejar el presupuesto aleatorio 37 | this.presupuesto = Math.random() * 1000000; 38 | } 39 | 40 | // Para el clone... 41 | private Pais(int id, String nombre, String codigo, String idioma, String moneda, String capital) { 42 | this.id = id; 43 | this.nombre = nombre; 44 | this.codigo = codigo; 45 | this.idioma = idioma; 46 | this.moneda = moneda; 47 | this.capital = capital; 48 | } 49 | 50 | public Pais(int id, String nombre, String codigo, String idioma, String moneda, String capital, double presupuesto) { 51 | this.id = id; 52 | this.nombre = nombre; 53 | this.codigo = codigo; 54 | this.idioma = idioma; 55 | this.moneda = moneda; 56 | this.capital = capital; 57 | this.presupuesto = presupuesto; 58 | } 59 | 60 | public int getId() { 61 | return id; 62 | } 63 | 64 | 65 | public String getNombre() { 66 | return nombre; 67 | } 68 | 69 | public void setNombre(String nombre) { 70 | this.nombre = nombre; 71 | } 72 | 73 | public String getCodigo() { 74 | return codigo; 75 | } 76 | 77 | public void setCodigo(String codigo) { 78 | this.codigo = codigo; 79 | } 80 | 81 | public String getIdioma() { 82 | return idioma; 83 | } 84 | 85 | public void setIdioma(String idioma) { 86 | this.idioma = idioma; 87 | } 88 | 89 | public String getMoneda() { 90 | return moneda; 91 | } 92 | 93 | public void setMoneda(String moneda) { 94 | this.moneda = moneda; 95 | } 96 | 97 | public String getCapital() { 98 | return capital; 99 | } 100 | 101 | public void setCapital(String capital) { 102 | this.capital = capital; 103 | } 104 | 105 | @Override 106 | public String toString() { 107 | return "Pais{" + "id=" + id + ", nombre=" + nombre + ", codigo=" + codigo + ", idioma=" + idioma + ", moneda=" + moneda + ", capital=" + capital + ", presupuesto=" + Formatter.moneyParser(presupuesto) + '}'; 108 | } 109 | 110 | 111 | public Pais nombre(String nombre) { 112 | this.nombre = nombre; 113 | return this; 114 | } 115 | 116 | public Pais codigo(String codigo) { 117 | this.codigo = codigo; 118 | return this; 119 | } 120 | 121 | public Pais idioma(String idioma) { 122 | this.idioma = idioma; 123 | return this; 124 | } 125 | 126 | public Pais moneda(String moneda) { 127 | this.moneda = moneda; 128 | return this; 129 | } 130 | 131 | public Pais capital(String capital) { 132 | this.capital = capital; 133 | return this; 134 | } 135 | 136 | public String presupuesto() { 137 | return Formatter.moneyParser(presupuesto); 138 | } 139 | 140 | @Override 141 | public boolean equals(Object o) { 142 | if (this == o) return true; 143 | if (!(o instanceof Pais)) return false; 144 | Pais pais = (Pais) o; 145 | return id == pais.id && nombre.equals(pais.nombre) && codigo.equals(pais.codigo) && idioma.equals(pais.idioma) && moneda.equals(pais.moneda) && capital.equals(pais.capital); 146 | } 147 | 148 | @Override 149 | public int hashCode() { 150 | return Objects.hash(id, nombre, codigo, idioma, moneda, capital); 151 | } 152 | 153 | @Override 154 | public Pais clone() { 155 | return new Pais(this.id, this.nombre, this.codigo, this.idioma, this.moneda, this.capital); 156 | } 157 | 158 | public String toString(String separator) { 159 | return id + separator + nombre + separator + codigo + separator + idioma + separator + moneda + separator + capital + separator + presupuesto; 160 | } 161 | } 162 | 163 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/repositories/AcuerdoRepository.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.repositories; 2 | 3 | import es.joseluisgs.dam.models.Acuerdo; 4 | 5 | import java.util.ArrayList; 6 | import java.util.HashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | public class AcuerdoRepository implements IAcuerdoRepository { 11 | private final Map acuerdos = new HashMap<>(); 12 | 13 | 14 | @Override 15 | public List findAll() { 16 | return new ArrayList<>(this.acuerdos.values()); 17 | } 18 | 19 | @Override 20 | public Acuerdo findById(Integer id) { 21 | return this.acuerdos.get(id); 22 | } 23 | 24 | @Override 25 | public Acuerdo save(Acuerdo entity) { 26 | this.acuerdos.put(entity.getId(), entity); 27 | return entity; 28 | } 29 | 30 | @Override 31 | public Acuerdo update(Integer id, Acuerdo entity) { 32 | this.acuerdos.put(id, entity); 33 | return entity; 34 | } 35 | 36 | @Override 37 | public Acuerdo delete(Integer id) { 38 | return this.acuerdos.remove(id); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/repositories/CRUDRepository.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.repositories; 2 | 3 | import java.util.List; 4 | 5 | // posteriormente lo cambiaré a Optional.... 6 | public interface CRUDRepository { 7 | List findAll(); 8 | 9 | T findById(ID id); 10 | 11 | T save(T entity); 12 | 13 | T update(ID id, T entity); 14 | 15 | T delete(ID id); 16 | } 17 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/repositories/IAcuerdoRepository.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.repositories; 2 | 3 | import es.joseluisgs.dam.models.Acuerdo; 4 | 5 | public interface IAcuerdoRepository extends CRUDRepository { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/repositories/IPaisRepository.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.repositories; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | // Toda nueva funcionalidad se extiende de la interfaz SOLID 6 | public interface IPaisRepository extends CRUDRepository { 7 | 8 | Pais findByNombre(String nombre); 9 | 10 | void clearAll(); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/repositories/PaisRepository.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.repositories; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | import java.util.TreeMap; 8 | 9 | /** 10 | * Repository para los paises siguiendo el TDA Mapa 11 | * Voy a usar un mapa y meteré la clave que es el ID 12 | * Con esto vemos lo sencillo que es usar mapas para este tipo de aplicaciones CRUD 13 | * Si lo hacemos bien, solo debo tocar el repositorio, porque tengo un buen diseño de capas 14 | */ 15 | public class PaisRepository implements IPaisRepository { 16 | private final TreeMap paises = new TreeMap<>(); 17 | 18 | /** 19 | * Busca un pais por su nombre 20 | * 21 | * @param nombre nombre del pais 22 | * @return el pais encontrado o null si no lo encuentra 23 | */ 24 | public Pais findByNombre(String nombre) { 25 | for (Pais pais : this.paises.values()) { 26 | if (pais.getNombre().equals(nombre)) 27 | return pais; 28 | } 29 | return null; 30 | } 31 | 32 | /** 33 | * Busca un pais por su id 34 | * 35 | * @param id id del pais 36 | * @return el pais encontrado o null si no lo encuentra 37 | */ 38 | @Override 39 | public Pais findById(Integer id) { 40 | return this.paises.get(id); 41 | } 42 | 43 | /** 44 | * Devuelve todos los paises 45 | * 46 | * @return lista de paises 47 | */ 48 | @Override 49 | public List findAll() { 50 | return new ArrayList<>(this.paises.values()); 51 | } 52 | 53 | /** 54 | * Añade un pais 55 | * 56 | * @param pais pais a añadir 57 | */ 58 | @Override 59 | public Pais save(Pais pais) { 60 | this.paises.put(pais.getId(), pais); 61 | return pais; 62 | } 63 | 64 | /** 65 | * Actualiza un pais 66 | * 67 | * @param id id del pais a actualizar 68 | * @param pais pais con los nuevos datos 69 | * @return el pais actualizado 70 | */ 71 | @Override 72 | public Pais update(Integer id, Pais pais) { 73 | this.paises.put(id, pais); 74 | return pais; 75 | } 76 | 77 | /** 78 | * Elimina un pais dado el id 79 | * 80 | * @param id id del pais a eliminar 81 | * @return el pais eliminado o null si no lo encuentra 82 | */ 83 | @Override 84 | public Pais delete(Integer id) { 85 | return this.paises.remove(id); 86 | } 87 | 88 | @Override 89 | public void clearAll() { 90 | this.paises.clear(); 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/services/IStorage.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.services; 2 | 3 | public interface IStorage { 4 | boolean save(T lista); 5 | 6 | T load(); 7 | 8 | String getStoragePath(); 9 | } 10 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/services/IStoragePaises.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.services; 2 | 3 | import es.joseluisgs.dam.models.Pais; 4 | 5 | import java.util.List; 6 | 7 | public interface IStoragePaises extends IStorage> { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/services/StoragePaisesJsonFile.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.services; 2 | 3 | import com.google.gson.Gson; 4 | import com.google.gson.GsonBuilder; 5 | import com.google.gson.reflect.TypeToken; 6 | import es.joseluisgs.dam.models.Pais; 7 | 8 | import java.io.*; 9 | import java.nio.file.Files; 10 | import java.nio.file.Path; 11 | import java.nio.file.Paths; 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | public class StoragePaisesJsonFile implements IStoragePaises { 16 | private final Path currentRelativePath = Paths.get(""); 17 | private final String ruta = currentRelativePath.toAbsolutePath().toString(); 18 | private final String dir = ruta + File.separator + "data"; 19 | private final String paisesFile = dir + File.separator + "paises.json"; 20 | 21 | 22 | public StoragePaisesJsonFile() { 23 | init(); 24 | } 25 | 26 | private void init() { 27 | Path path = Paths.get(dir); 28 | if (!Files.exists(path)) { 29 | try { 30 | Files.createDirectories(path); 31 | } catch (IOException e) { 32 | System.out.println("Error: " + e.getMessage()); 33 | } 34 | } 35 | } 36 | 37 | @Override 38 | public boolean save(List lista) { 39 | Gson gson = new GsonBuilder().setPrettyPrinting().create(); 40 | boolean result = false; 41 | PrintWriter f = null; 42 | try { 43 | f = new PrintWriter(new FileWriter(paisesFile)); 44 | f.println(gson.toJson(lista)); 45 | result = true; 46 | 47 | } catch (Exception e) { 48 | System.out.println("Error: " + e.getMessage()); 49 | result = false; 50 | } finally { 51 | if (f != null) { 52 | f.close(); 53 | } 54 | } 55 | return result; 56 | } 57 | 58 | @Override 59 | public List load() { 60 | Gson gson = new GsonBuilder().setPrettyPrinting().create(); 61 | List lista = new ArrayList<>(); 62 | Reader reader = null; 63 | try { 64 | reader = Files.newBufferedReader(Paths.get(paisesFile)); 65 | // Dos opciones 66 | // Opcion A 67 | // var paises = gson.fromJson(reader, Pais[].class); 68 | // lista = List.of(paises); 69 | // Opcion B. Debe resolver los datos dinamicamente 70 | lista = gson.fromJson(reader, new TypeToken>() { 71 | }.getType()); 72 | } catch (Exception e) { 73 | System.out.println("Error: " + e.getMessage()); 74 | } finally { 75 | if (reader != null) { 76 | try { 77 | reader.close(); 78 | } catch (IOException e) { 79 | System.out.println("Error: " + e.getMessage()); 80 | } 81 | } 82 | } 83 | return lista; 84 | } 85 | 86 | @Override 87 | public String getStoragePath() { 88 | return paisesFile; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/utils/Console.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.utils; 2 | 3 | import java.util.Scanner; 4 | 5 | /** 6 | * Clase que permite leer datos desde la consola. 7 | */ 8 | public class Console { 9 | public static String getString(String message) { 10 | System.out.println(message); 11 | return new Scanner(System.in).nextLine().trim(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/utils/Formatter.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.utils; 2 | 3 | import java.text.NumberFormat; 4 | import java.time.LocalDateTime; 5 | import java.time.format.DateTimeFormatter; 6 | import java.time.format.FormatStyle; 7 | import java.util.Locale; 8 | 9 | public class Formatter { 10 | 11 | public static String dateParser(LocalDateTime date) { 12 | final Locale locale = new Locale("es", "ES"); 13 | // private String pattern = "dd/MM/yyyy"; 14 | return date.format(DateTimeFormatter 15 | .ofLocalizedDate(FormatStyle.MEDIUM).withLocale(locale)); 16 | } 17 | 18 | public static String moneyParser(Double money) { 19 | final Locale locale = new Locale("es", "ES"); 20 | return NumberFormat.getCurrencyInstance(locale).format(money); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Soluciones/12-MVC-Paises-FicherosJson/src/main/java/es/joseluisgs/dam/views/PaisView.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.views; 2 | 3 | import es.joseluisgs.dam.comparators.PaisNombreComparator; 4 | import es.joseluisgs.dam.controllers.AcuerdoController; 5 | import es.joseluisgs.dam.controllers.PaisController; 6 | import es.joseluisgs.dam.models.Pais; 7 | import es.joseluisgs.dam.repositories.AcuerdoRepository; 8 | import es.joseluisgs.dam.repositories.PaisRepository; 9 | import es.joseluisgs.dam.services.StoragePaisesJsonFile; 10 | import es.joseluisgs.dam.utils.Console; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | import java.util.Locale; 15 | 16 | /** 17 | * Sería la vista de un país., pronto será un formulario... 18 | */ 19 | public class PaisView { 20 | private static PaisView instance; 21 | // Le inyectamos la dependencia. 22 | private final PaisController paisController = new PaisController(new PaisRepository(), new StoragePaisesJsonFile()); 23 | // No necesitamos hacer un singleton 24 | private final AcuerdoController acuerdoController = new AcuerdoController(new AcuerdoRepository()); 25 | 26 | private PaisView() { 27 | } 28 | 29 | public static PaisView getInstance() { 30 | if (instance == null) { 31 | instance = new PaisView(); 32 | } 33 | return instance; 34 | } 35 | 36 | /** 37 | * Salir del programa 38 | */ 39 | private static void salir() { 40 | System.out.println("¡Hasta pronto!"); 41 | System.exit(0); 42 | } 43 | 44 | /** 45 | * Muestra los paises ordenados por nombre 46 | */ 47 | private void mostrarPaises() { 48 | System.out.println("Mostrar países"); 49 | // Obtengo los países 50 | List paises = paisController.getAllPaises(); 51 | // Puedes probar otro comparador 52 | paises.sort(new PaisNombreComparator()); 53 | System.out.println("Hay " + paises.size() + " países"); 54 | for (Pais pais : paises) { 55 | System.out.println(pais); 56 | } 57 | } 58 | 59 | /** 60 | * Actualiza un pais 61 | */ 62 | private void actualizarPais() { 63 | System.out.println("Actualizar país"); 64 | String nombre = Console.getString("Nombre del país: "); 65 | System.out.println("Introduce los nuevos datos o deje en blanco para mantener los actuales"); 66 | 67 | try { 68 | // Comprobamos si existe el pais antes de pedirle los datos 69 | var existe = paisController.getPaisByNombre(nombre); 70 | 71 | // Tomamos los nuevos datos o nos quedamos con los antiguos si son blancos. 72 | String nuevoNombre = Console.getString("Nuevo nombre del país (anterior: " + existe.getNombre() + "): "); 73 | nuevoNombre = (nuevoNombre.isEmpty()) ? existe.getNombre() : nuevoNombre; 74 | String nuevoCodigo = Console.getString("Nuevo código del país (anterior: " + existe.getCodigo() + "): "); 75 | nuevoCodigo = (nuevoCodigo.isEmpty()) ? existe.getCodigo() : nuevoCodigo; 76 | String nuevoIdioma = Console.getString("Nuevo idioma del país (anterior: " + existe.getIdioma() + "): "); 77 | nuevoIdioma = (nuevoIdioma.isEmpty()) ? existe.getIdioma() : nuevoIdioma; 78 | String nuevoCapital = Console.getString("Nueva capital del país (anterior: " + existe.getCapital() + "): "); 79 | nuevoCapital = (nuevoCapital.isEmpty()) ? existe.getCapital() : nuevoCapital; 80 | String nuevoMoneda = Console.getString("Nueva moneda del país (anterior: " + existe.getMoneda() + "): "); 81 | nuevoMoneda = (nuevoMoneda.isEmpty()) ? existe.getMoneda() : nuevoMoneda; 82 | 83 | // Es importante crear un objeto nuevo, porque si no al ser referencias tocamos el del repositorio 84 | // Esto no pasará con ficheros o bases de datos 85 | var update = existe.clone() 86 | .nombre(nuevoNombre) 87 | .codigo(nuevoCodigo) 88 | .idioma(nuevoIdioma) 89 | .capital(nuevoCapital) 90 | .moneda(nuevoMoneda); 91 | 92 | // Actualizamos el pais 93 | var res = paisController.updatePais(existe.getId(), update); 94 | System.out.println("País actualizado"); 95 | System.out.println(res); 96 | } catch (Exception e) { 97 | System.out.println("Error al actualizar un pais. " + e.getMessage()); 98 | } 99 | } 100 | 101 | /** 102 | * Elimina un pais 103 | */ 104 | private void eliminarPais() { 105 | System.out.println("Eliminar país"); 106 | String nombre = Console.getString("Nombre del país: "); 107 | try { 108 | var res = paisController.deletePais(nombre); 109 | System.out.println("País eliminado correctamente"); 110 | System.out.println(res); 111 | } catch (Exception e) { 112 | System.out.println("Error al eliminar: " + e.getMessage()); 113 | } 114 | } 115 | 116 | /** 117 | * Crea un pais 118 | */ 119 | private void crearPais() { 120 | System.out.println("Crear país"); 121 | System.out.println("Los datos no pueden estar vacíos"); 122 | String nombre = Console.getString("Nombre del país: "); 123 | String codigo = Console.getString("Código del país: "); 124 | String idioma = Console.getString("Idioma principal: "); 125 | String moneda = Console.getString("Nombre de la moneda: "); 126 | String capital = Console.getString("Nombre de la capital: "); 127 | 128 | // Deberíamos comprobar que los datos son correctos tanto en la vista como en el backend!! 129 | // No hay que fiarse nunca. Imagina que es un mívil y los datos van a un servidor remoto. 130 | 131 | // Pais pais = new Pais(nombre, codigo, idioma, moneda, capital); 132 | // uso interfaz fluída, hasta que sepa hacer builder :) 133 | Pais pais = new Pais() 134 | .nombre(nombre) 135 | .codigo(codigo) 136 | .idioma(idioma) 137 | .moneda(moneda) 138 | .capital(capital); 139 | 140 | // insertamos el pais 141 | try { 142 | var res = paisController.crearPais(pais); 143 | System.out.println("País creado correctamente"); 144 | System.out.println(res); 145 | } catch (Exception e) { 146 | System.out.println("Error al crear: " + e.getMessage()); 147 | } 148 | } 149 | 150 | public void menu() { 151 | System.out.println("Gestion de Paises"); 152 | System.out.println("================="); 153 | // Bucle infinito a la espera de una opción o salir 154 | do { 155 | System.out.println(); 156 | System.out.println("1. Crear país"); 157 | System.out.println("2. Eliminar país"); 158 | System.out.println("3. Actualizar país"); 159 | System.out.println("4. Mostrar países"); 160 | System.out.println("5. Consultar país"); 161 | System.out.println("6. Crear Acuerdos Internacionales"); 162 | System.out.println("7. Importar/Exportar"); 163 | System.out.println("0. Salir"); 164 | System.out.println(); 165 | String opcion = Console.getString("Elige una opción [0-7]: "); 166 | // Expresion regular para validar la opción 167 | var regex = "[0-8]"; 168 | if (opcion.matches(regex)) { 169 | switch (opcion) { 170 | case "1": 171 | crearPais(); 172 | break; 173 | case "2": 174 | eliminarPais(); 175 | break; 176 | case "3": 177 | actualizarPais(); 178 | break; 179 | case "4": 180 | mostrarPaises(); 181 | break; 182 | case "5": 183 | getPaisByNombre(); 184 | break; 185 | case "6": 186 | crearAcuerdos(); 187 | break; 188 | case "7": 189 | importarExportar(); 190 | break; 191 | case "0": 192 | salir(); 193 | break; 194 | } 195 | } 196 | } while (true); 197 | } 198 | 199 | private void importarExportar() { 200 | System.out.println("Copia de Seguridad de Datos"); 201 | var regex = "importar|exportar"; 202 | var opcion = ""; 203 | do { 204 | opcion = Console.getString("Importar/Exportar datos: ").toLowerCase(Locale.getDefault()); 205 | if (!opcion.matches(regex)) { 206 | System.out.println("Opción incorrecta"); 207 | } 208 | } while (!opcion.matches(regex)); 209 | 210 | switch (opcion) { 211 | case "importar": 212 | paisController.importarDatos(); 213 | break; 214 | case "exportar": 215 | paisController.exportarDatos(); 216 | break; 217 | } 218 | 219 | } 220 | 221 | /** 222 | * Crear acuerdos internacionales 223 | */ 224 | private void crearAcuerdos() { 225 | System.out.println("Realizar Acuerdo Internacional"); 226 | 227 | var paises = inputLineasPaises(); 228 | 229 | try { 230 | var res = acuerdoController.crearAcuerdo("Acuerdo Internacional", "Un acuerdo", paises); 231 | System.out.println("El acuerdo se firmó correctamente"); 232 | System.out.println(res); 233 | } catch (Exception e) { 234 | System.out.println("Error al crear acuerdo: " + e.getMessage()); 235 | } 236 | } 237 | 238 | /** 239 | * Incluye los paises en una lista 240 | */ 241 | private List inputLineasPaises() { 242 | var lineas = new ArrayList(); 243 | var correcto = false; 244 | do { 245 | var error = false; 246 | var paises = Console.getString("Nombre de los paises separados por coma: ").split(","); 247 | // revisamos que las matriculas introducidas existan 248 | for (String nombre : paises) { 249 | try { 250 | var pais = paisController.getPaisByNombre(nombre.trim()); 251 | lineas.add(pais); 252 | } catch (Exception e) { 253 | System.out.println(e.getMessage()); 254 | error = true; 255 | } 256 | } 257 | // Si salimos de aqui es que todo es correcto 258 | if (lineas.isEmpty() || error) { 259 | System.out.println("No se han introducido un país válido. Vuelva a intentarlo."); 260 | } else { 261 | correcto = true; 262 | } 263 | } while (!correcto); 264 | return lineas; 265 | } 266 | 267 | /** 268 | * Obtiene un pais por su nombre 269 | */ 270 | private void getPaisByNombre() { 271 | System.out.println("Mostrar país"); 272 | String nombre = Console.getString("Nombre del país: "); 273 | try { 274 | var res = paisController.getPaisByNombre(nombre); 275 | System.out.println(res); 276 | } catch (Exception e) { 277 | System.out.println("Error al consultar: " + e.getMessage()); 278 | } 279 | } 280 | } 281 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple Java application that includes a class with main() method -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/.idea/libraries/Maven__com_google_code_gson_gson_2_9_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/.idea/project-template.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/Pokedex.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | groupId 8 | Pokedex 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 11 13 | 11 14 | 15 | 16 | 17 | 18 | 19 | com.google.code.gson 20 | gson 21 | 2.9.0 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/src/main/java/es/joseluisgs/dam/Main.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam; 2 | 3 | import com.google.gson.Gson; 4 | import com.google.gson.GsonBuilder; 5 | import es.joseluisgs.dam.controllers.PokemonController; 6 | import es.joseluisgs.dam.models.Pokemon; 7 | 8 | /** 9 | * https://freecodegenerators.com/code-converters/json-to-pojo 10 | */ 11 | public class Main { 12 | 13 | public static void main(String[] args) { 14 | System.out.println("Hello Pokedex!"); 15 | var pokeController = PokemonController.getInstance(); 16 | var pokemon = pokeController.getPokemon(24); 17 | printPokemon(pokemon); 18 | printPokemonJson(pokemon); 19 | } 20 | 21 | private static void printPokemon(Pokemon pokemon) { 22 | System.out.println(pokemon); 23 | } 24 | 25 | private static void printPokemonJson(Pokemon pokemon) { 26 | Gson gson = new GsonBuilder().setPrettyPrinting().create(); 27 | System.out.println(gson.toJson(pokemon)); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/src/main/java/es/joseluisgs/dam/controllers/PokemonController.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.controllers; 2 | 3 | import com.google.gson.Gson; 4 | import com.google.gson.GsonBuilder; 5 | import com.google.gson.reflect.TypeToken; 6 | import es.joseluisgs.dam.models.Pokedex; 7 | import es.joseluisgs.dam.models.Pokemon; 8 | 9 | import java.io.File; 10 | import java.io.IOException; 11 | import java.io.Reader; 12 | import java.nio.file.Files; 13 | import java.nio.file.Path; 14 | import java.nio.file.Paths; 15 | 16 | public class PokemonController { 17 | private static PokemonController instance; 18 | private Pokedex pokedex; 19 | 20 | private PokemonController() { 21 | loadPokedex(); 22 | } 23 | 24 | public static PokemonController getInstance() { 25 | if (instance == null) { 26 | instance = new PokemonController(); 27 | } 28 | return instance; 29 | } 30 | 31 | private void loadPokedex() { 32 | Path currentRelativePath = Paths.get(""); 33 | String ruta = currentRelativePath.toAbsolutePath().toString(); 34 | String dir = ruta + File.separator + "data"; 35 | String paisesFile = dir + File.separator + "pokemon.json"; 36 | Gson gson = new GsonBuilder().setPrettyPrinting().create(); 37 | 38 | Reader reader = null; 39 | try { 40 | reader = Files.newBufferedReader(Paths.get(paisesFile)); 41 | this.pokedex = gson.fromJson(reader, new TypeToken() { 42 | }.getType()); 43 | System.out.println("Pokedex loaded! There are: " + pokedex.pokemon.size()); 44 | } catch (Exception e) { 45 | System.out.println("Error loading Pokedex!"); 46 | System.out.println("Error: " + e.getMessage()); 47 | } finally { 48 | if (reader != null) { 49 | try { 50 | reader.close(); 51 | } catch (IOException e) { 52 | System.out.println("Error: " + e.getMessage()); 53 | } 54 | } 55 | } 56 | } 57 | 58 | public Pokemon getPokemon(int index) { 59 | return pokedex.pokemon.get(index); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/src/main/java/es/joseluisgs/dam/models/NextEvolution.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.models; 2 | 3 | public class NextEvolution { 4 | public String num; 5 | public String name; 6 | 7 | @Override 8 | public String toString() { 9 | return "NextEvolution{" + 10 | "num='" + num + '\'' + 11 | ", name='" + name + '\'' + 12 | '}'; 13 | } 14 | } -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/src/main/java/es/joseluisgs/dam/models/Pokedex.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.models; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class Pokedex { 6 | public ArrayList pokemon; 7 | } 8 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/src/main/java/es/joseluisgs/dam/models/Pokemon.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.models; 2 | 3 | 4 | import java.util.ArrayList; 5 | 6 | public class Pokemon { 7 | public int id; 8 | public String num; 9 | public String name; 10 | public String img; 11 | public ArrayList type; 12 | public String height; 13 | public String weight; 14 | public String candy; 15 | public int candy_count; 16 | public String egg; 17 | public double spawn_chance; 18 | public double avg_spawns; 19 | public String spawn_time; 20 | public ArrayList multipliers; 21 | public ArrayList weaknesses; 22 | public ArrayList next_evolution; 23 | public ArrayList prev_evolution; 24 | 25 | @Override 26 | public String toString() { 27 | return "Pokemon{" + 28 | "id=" + id + 29 | ", num='" + num + '\'' + 30 | ", name='" + name + '\'' + 31 | ", img='" + img + '\'' + 32 | ", type=" + type + 33 | ", height='" + height + '\'' + 34 | ", weight='" + weight + '\'' + 35 | ", candy='" + candy + '\'' + 36 | ", candy_count=" + candy_count + 37 | ", egg='" + egg + '\'' + 38 | ", spawn_chance=" + spawn_chance + 39 | ", avg_spawns=" + avg_spawns + 40 | ", spawn_time='" + spawn_time + '\'' + 41 | ", multipliers=" + multipliers + 42 | ", weaknesses=" + weaknesses + 43 | ", next_evolution=" + next_evolution + 44 | ", prev_evolution=" + prev_evolution + 45 | '}'; 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /Soluciones/13-Pokedex/src/main/java/es/joseluisgs/dam/models/PrevEvolution.java: -------------------------------------------------------------------------------- 1 | package es.joseluisgs.dam.models; 2 | 3 | public class PrevEvolution { 4 | public String num; 5 | public String name; 6 | 7 | @Override 8 | public String toString() { 9 | return "PrevEvolution{" + "num=" + num + ", name=" + name + '}'; 10 | } 11 | } -------------------------------------------------------------------------------- /UD08.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-08-2021-2022/be39cbce5e9e73858b2c7802b70045b274150272/UD08.pdf --------------------------------------------------------------------------------