├── .gitignore ├── Practicas ├── accidentes │ ├── 2023_Accidentalidad.csv │ ├── Estructura_ConjuntoDatos_Accidentesv2.pdf │ └── README.md ├── aemet │ ├── Aemet20171029.csv │ ├── Aemet20171030.csv │ ├── Aemet20171031.csv │ └── README.md ├── buerguer-pig │ └── README.md ├── herencia-dto │ ├── README.md │ └── personas.csv ├── moria │ └── Enunciado.pdf └── productos │ ├── README.md │ └── products.csv ├── README.md ├── Soluciones ├── 01-Ficheros-Texto │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ └── Main.kt ├── 02-Ficheros-CSV │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── data │ │ ├── vehiculos-back.csv │ │ └── vehiculos.csv │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ ├── Main.kt │ │ └── models │ │ └── Vehiculo.kt ├── 03-Ficheros-CSV-DTO │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── .name │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── data │ │ ├── vehiculos-back.csv │ │ └── vehiculos.csv │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ ├── Main.kt │ │ ├── dto │ │ └── VehiculoDto.kt │ │ ├── mappers │ │ └── VehiculoMapper.kt │ │ └── models │ │ └── Vehiculo.kt ├── 04-Aula-CSV-Resources │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ ├── kotlin │ │ ├── Main.kt │ │ ├── dto │ │ │ └── PersonasDto.kt │ │ ├── mappers │ │ │ └── PersonaMapper.kt │ │ └── models │ │ │ ├── Docente.kt │ │ │ ├── Estudiante.kt │ │ │ └── Persona.kt │ │ └── resources │ │ ├── README.md │ │ └── personas.csv ├── 05-Ficheros-JSON-DTO │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── .name │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── data │ │ ├── vehiculos.csv │ │ └── vehiculos.json │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ ├── Main.kt │ │ ├── dto │ │ └── VehiculoDto.kt │ │ ├── mappers │ │ └── VehiculoMapper.kt │ │ └── models │ │ └── Vehiculo.kt ├── 06-Aula-JSON-Resources │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── .name │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── data │ │ └── informe.json │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ ├── kotlin │ │ ├── Main.kt │ │ ├── dto │ │ │ ├── DocenteDto.kt │ │ │ ├── EstudianteDto.kt │ │ │ ├── InformeDto.kt │ │ │ └── PersonasDto.kt │ │ ├── import │ │ │ ├── DocenteImportDto.kt │ │ │ ├── EstudianteImportDto.kt │ │ │ └── ImportDto.kt │ │ ├── mappers │ │ │ └── PersonaMapper.kt │ │ └── models │ │ │ ├── Docente.kt │ │ │ ├── Estudiante.kt │ │ │ └── Persona.kt │ │ └── resources │ │ ├── README.md │ │ └── personas.csv ├── 07-Pokedex-JSON │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ ├── kotlin │ │ ├── Main.kt │ │ ├── import │ │ │ ├── NextEvolution.kt │ │ │ ├── PokedexDto.kt │ │ │ ├── PokemonDto.kt │ │ │ └── PrevEvolution.kt │ │ └── models │ │ │ └── Pokemon.kt │ │ └── resources │ │ └── pokemon.json ├── 08-Barcos-FileService │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ ├── misc.xml │ │ └── uiDesigner.xml │ ├── build.gradle.kts │ ├── data │ │ ├── barcos-back.csv │ │ ├── barcos.csv │ │ └── barcos.json │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ ├── main │ │ └── kotlin │ │ │ ├── Main.kt │ │ │ ├── dev │ │ │ └── joseluisgs │ │ │ │ └── validator │ │ │ │ └── barco │ │ │ │ └── BarcosValidator.kt │ │ │ ├── dto │ │ │ └── barco │ │ │ │ └── BarcoDto.kt │ │ │ ├── exceptions │ │ │ ├── barco │ │ │ │ └── BarcoExceptions.kt │ │ │ └── storage │ │ │ │ └── StorageExceptions.kt │ │ │ ├── mappers │ │ │ └── barco │ │ │ │ └── BarcoMapper.kt │ │ │ ├── models │ │ │ └── barco │ │ │ │ ├── Atunero.kt │ │ │ │ ├── Barco.kt │ │ │ │ ├── Mantenimiento.kt │ │ │ │ ├── Marisquero.kt │ │ │ │ ├── PescarConCaña.kt │ │ │ │ └── PescarConRed.kt │ │ │ ├── repositories │ │ │ ├── barco │ │ │ │ ├── BarcosRepository.kt │ │ │ │ └── BarcosRepositoryImpl.kt │ │ │ ├── cache │ │ │ │ ├── Cache.kt │ │ │ │ └── CacheImpl.kt │ │ │ └── crud │ │ │ │ └── CrudRepository.kt │ │ │ └── services │ │ │ ├── barco │ │ │ ├── BarcosService.kt │ │ │ └── BarcosServiceImpl.kt │ │ │ └── storage │ │ │ ├── barco │ │ │ ├── BarcosFileStorageCsv.kt │ │ │ └── BarcosFileStorageJson.kt │ │ │ └── base │ │ │ └── FileStorage.kt │ │ └── test │ │ └── kotlin │ │ ├── dev │ │ └── joseluisgs │ │ │ └── validator │ │ │ └── barco │ │ │ └── BarcosValidatorTest.kt │ │ └── services │ │ └── barco │ │ └── BarcosServiceImplTest.kt ├── 09-Barcos-FileService-Config-Backup │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ ├── misc.xml │ │ └── uiDesigner.xml │ ├── backup │ │ └── barcos.zip │ ├── build.gradle.kts │ ├── data │ │ ├── barcos-2.json │ │ ├── barcos-back.csv │ │ ├── barcos.csv │ │ └── barcos.json │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ ├── main │ │ ├── kotlin │ │ │ ├── Main.kt │ │ │ ├── config │ │ │ │ └── Config.kt │ │ │ ├── dev │ │ │ │ └── joseluisgs │ │ │ │ │ └── validator │ │ │ │ │ └── barco │ │ │ │ │ └── BarcosValidator.kt │ │ │ ├── dto │ │ │ │ └── barco │ │ │ │ │ └── BarcoDto.kt │ │ │ ├── exceptions │ │ │ │ ├── barco │ │ │ │ │ └── BarcoExceptions.kt │ │ │ │ └── storage │ │ │ │ │ └── StorageExceptions.kt │ │ │ ├── mappers │ │ │ │ └── barco │ │ │ │ │ └── BarcoMapper.kt │ │ │ ├── models │ │ │ │ └── barco │ │ │ │ │ ├── Atunero.kt │ │ │ │ │ ├── Barco.kt │ │ │ │ │ ├── Mantenimiento.kt │ │ │ │ │ ├── Marisquero.kt │ │ │ │ │ ├── PescarConCaña.kt │ │ │ │ │ └── PescarConRed.kt │ │ │ ├── repositories │ │ │ │ ├── barco │ │ │ │ │ ├── BarcosRepository.kt │ │ │ │ │ └── BarcosRepositoryImpl.kt │ │ │ │ ├── cache │ │ │ │ │ ├── Cache.kt │ │ │ │ │ └── CacheImpl.kt │ │ │ │ └── crud │ │ │ │ │ └── CrudRepository.kt │ │ │ └── services │ │ │ │ ├── backup │ │ │ │ ├── Backup.kt │ │ │ │ └── BackupImpl.kt │ │ │ │ ├── barco │ │ │ │ ├── BarcosService.kt │ │ │ │ └── BarcosServiceImpl.kt │ │ │ │ └── storage │ │ │ │ ├── barco │ │ │ │ ├── BarcosFileStorageCsv.kt │ │ │ │ └── BarcosFileStorageJson.kt │ │ │ │ └── base │ │ │ │ └── FileStorage.kt │ │ └── resources │ │ │ └── config.properties │ │ └── test │ │ └── kotlin │ │ ├── dev │ │ └── joseluisgs │ │ │ └── validator │ │ │ └── barco │ │ │ └── BarcosValidatorTest.kt │ │ └── services │ │ └── barco │ │ └── BarcosServiceImplTest.kt ├── 10-Ficheros-XML │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── data │ │ ├── venta.json │ │ └── venta.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ ├── Main.kt │ │ └── models │ │ ├── Cliente.kt │ │ ├── Producto.kt │ │ └── Venta.kt ├── 11-AccidentesMadrid │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ ├── kotlin │ │ ├── Main.kt │ │ └── dev │ │ │ └── joseluisgs │ │ │ ├── models │ │ │ └── Accidente.kt │ │ │ └── services │ │ │ └── AccidentesService.kt │ │ └── resources │ │ ├── 2023_Accidentalidad.csv │ │ └── Estructura_ConjuntoDatos_Accidentesv2.pdf ├── 12-Ficheros-Serializacion │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── .name │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── data │ │ ├── venta.dat │ │ ├── venta.json │ │ └── venta.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ ├── Main.kt │ │ └── models │ │ ├── Cliente.kt │ │ ├── Producto.kt │ │ └── Venta.kt ├── 13-Ficheros-Binarios │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── data │ │ ├── hello.dat │ │ └── hello.txt │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ └── Main.kt ├── 14-Ficheros-Binarios-Venta │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── .name │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── data │ │ ├── venta.dat │ │ ├── venta.json │ │ └── venta.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ ├── Main.kt │ │ └── models │ │ ├── Cliente.kt │ │ ├── Producto.kt │ │ └── Venta.kt ├── 15-Aemet │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── reports │ │ ├── report-2024-02-29.json │ │ └── report-2024-02-29.xml │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ ├── kotlin │ │ ├── Main.kt │ │ ├── models │ │ │ ├── Informe.kt │ │ │ └── Medicion.kt │ │ └── services │ │ │ └── MeteoService.kt │ │ └── resources │ │ ├── Aemet20171029.csv │ │ ├── Aemet20171030.csv │ │ ├── Aemet20171031.csv │ │ └── README.md ├── 16-Ficheros-Aleatorio │ ├── .gitignore │ ├── .idea │ │ ├── .gitignore │ │ ├── gradle.xml │ │ ├── inspectionProfiles │ │ │ └── Project_Default.xml │ │ ├── kotlinc.xml │ │ └── misc.xml │ ├── build.gradle.kts │ ├── data │ │ ├── enteros.dat │ │ └── texto.txt │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ └── Main.kt └── 18-Alumnado │ ├── .gitignore │ ├── .idea │ ├── .gitignore │ ├── gradle.xml │ ├── inspectionProfiles │ │ └── Project_Default.xml │ ├── kotlinc.xml │ └── misc.xml │ ├── build.gradle.kts │ ├── data │ ├── alumnos.bin │ ├── alumnos.csv │ ├── alumnos.dat │ ├── alumnos.json │ ├── alumnos.txt │ └── alumnos.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle.kts │ └── src │ └── main │ └── kotlin │ ├── Main.kt │ ├── factories │ └── AlumnadoFactory.kt │ ├── models │ └── Alumno.kt │ └── services │ ├── Storage.kt │ ├── StorageBinario.kt │ ├── StorageCsv.kt │ ├── StorageJson.kt │ ├── StorageSerializable.kt │ ├── StorageTexto.kt │ └── StorageXml.kt └── images ├── file.png ├── java-io-vs-nio.png └── jeraquia.png /.gitignore: -------------------------------------------------------------------------------- 1 | *.pptx 2 | *.docx 3 | .DS_Store 4 | /Ejercicios/*.docx 5 | upload.sh 6 | /Soluciones/2021-2022 7 | /Soluciones/2022-2023 8 | *.docx 9 | /Ejemplos/2022-2023 10 | -------------------------------------------------------------------------------- /Practicas/accidentes/Estructura_ConjuntoDatos_Accidentesv2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Practicas/accidentes/Estructura_ConjuntoDatos_Accidentesv2.pdf -------------------------------------------------------------------------------- /Practicas/accidentes/README.md: -------------------------------------------------------------------------------- 1 | # Accidentes de Madrid 2 | 3 | Dado el fichero de accidentes CSV, leerlo pasarlo a JSON y XML. Volver a leer ambos. 4 | 5 | Realizar las siguientes consultas: 6 | 7 | - Accidentes en los que estan implicados alcohol o drogas. 8 | - Numero de accidentes que han dado positivo en alcohol y drogas. 9 | - Accidentes agrupados por sexo. 10 | - Accidentes agrupados por meses. 11 | - Accidentes agrupados por tipos de vehiculos. 12 | - Accidentes ocurridos en la calle de leganes. 13 | - Numero de accidentes por distrito. 14 | - Estadisticas por distrito. 15 | - Accidentes por distrito ordenadas de manera descendente. 16 | - Listado de accidentes que se produzcan en fin de semana y de noche (a partir de las 8 de la tarde hasta las 6 de la mañana) 17 | - Listado de accidentes que se produzcan en fin de semana y de noche donde se haya dado positivo en alcohol 18 | - Accidentes donde haya mas de un fallecido. 19 | - Comprobar si el distrito con mas accidentes coincide con el distrito donde hay más accidentes en fin de semana. 20 | - Numero de accidentes donde ha habido (alcohol o drogas) y victimas mortales. 21 | - Numero de accidentes donde ha habido atropellos a personas. 22 | - Accidentes agrupados por estado metereológio. 23 | - Lista de accidentes donde haya habido un atropello animal. 24 | -------------------------------------------------------------------------------- /Practicas/aemet/Aemet20171029.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Practicas/aemet/Aemet20171029.csv -------------------------------------------------------------------------------- /Practicas/aemet/Aemet20171031.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Practicas/aemet/Aemet20171031.csv -------------------------------------------------------------------------------- /Practicas/aemet/README.md: -------------------------------------------------------------------------------- 1 | # Servicio meteorológico 2 | 3 | 1. Leer los tres ficheros y combinarlos en uno solo completando los datos e incluyendo el campo fecha 4 | 2. Exportar el resultado a Json y XML 5 | 3. Realizar las siguientes consultas: 6 | - Temperatura máxima por día y lugar 7 | - Temperatura mínima por día y lugar 8 | - Temperatura máxima por provincia (día, lugar, valor y momento) 9 | - Temperatura mínima por provincia (día, lugar, valor y valor) 10 | - Temperatura media por provincia (día, lugar y valor) 11 | - Listado de precipitación media por día y provincia 12 | - Numero de lugares en el que llovío por día y provincia 13 | - Temperatura média de la provincia de Madrid 14 | - Media de temperatura máxima total 15 | - Media de temprratura minima total 16 | - Lugares donde la máxima ha sido antes de las 15:00 por día 17 | - Lugares donde la mínima ha sido después de las 17:30 por día 18 | 19 | 4.- Para la privincia de Madid exportar en JSON y XML el siguiente informe 20 | - Por cada día: 21 | - Temperatura media 22 | - Temperatura máxima (Lugar y momento) 23 | - Temperatura mínima (Lugar y momento 24 | - Si hubo precipitación (sí/no) y valor de la misma. 25 | -------------------------------------------------------------------------------- /Practicas/buerguer-pig/README.md: -------------------------------------------------------------------------------- 1 | # Burguer Pig 2 | 3 | Crear repositorios y almacenamiento para: 4 | - Hamburguesa (id: UUID, nombre: String, List>, precio: calculado desde ingredientes)) 5 | - Ingrediente (id: Autonumerico, nombre: String, precio: Double) 6 | 7 | Crear almacenamiento y repositorio para leer y escribir Ingredientes y Hambuguesas: 8 | - Ficheros de texto 9 | - Ficheros binarios 10 | - Ficheros serializados 11 | - Ficheros CSV 12 | - Ficheros JSON 13 | - Ficheros XML 14 | 15 | Adems obtener: 16 | 17 | - Hambuguesa más cara 18 | - Hambuguesa con más ingredientes 19 | - Número de Hambuguesas por ingrediente 20 | - Hambuguesaas agrupadas por total de ingredientes 21 | - Precio medio de las hambuguesas 22 | - Precio medio de los ingredientes. 23 | -------------------------------------------------------------------------------- /Practicas/herencia-dto/README.md: -------------------------------------------------------------------------------- 1 | # Herencia, DTO y Ficheros 2 | 3 | Dada esta estructura 4 | - Persona(nombre: String) 5 | - Profesor(modulo: String): Persona 6 | - Alumno(edad: Int): Persona 7 | 8 | Leer el fichero personas.csv que puede estar en a carpeta "resources" (o "data") 9 | 10 | Consultas: 11 | - Profesor más mayor 12 | - Alumno más joven 13 | - Media de edad de alumnos 14 | - Media de longitud de nombre 15 | - Listado de agrupados por tipo 16 | - Listado de profesores de programación 17 | - Agrupados por edad, numero de alumnos 18 | - Agrupados por modulo, numero de profesores 19 | - Agrupados por edad, obtener la longitud de nombre. 20 | - Agrupados por edad, obtener el nombre mas largo. 21 | 22 | Escribir en un fichero llamado profesores.csv, solo los datos de los profesores en la carpeta "output" 23 | -------------------------------------------------------------------------------- /Practicas/herencia-dto/personas.csv: -------------------------------------------------------------------------------- 1 | id,nombre,createdAt,tipo,modulo,edad 2 | 1,Profesor 1,2024-12-02,Profesor,Programación, 3 | 2,Profesor 2,2024-12-02,Profesor,Entornos, 4 | 3,Profesor 3,2024-12-02,Profesor,Programación, 5 | 4,Profesor 4,2024-12-02,Profesor,Entornos, 6 | 5,Profesor 5,2024-12-02,Profesor,Programación, 7 | 6,Profesor 6,2024-12-02,Profesor,Entornos, 8 | 7,Profesor 7,2024-12-02,Profesor,Programación, 9 | 8,Profesor 8,2024-12-02,Profesor,Entornos, 10 | 9,Profesor 9,2024-12-02,Profesor,Programación, 11 | 10,Profesor 10,2024-12-02,Profesor,Entornos, 12 | 11,Alumno 1,2024-12-02,Alumno,,18 13 | 12,Alumno 2,2024-12-02,Alumno,,20 14 | 13,Alumno 3,2024-12-02,Alumno,,22 15 | 14,Alumno 4,2024-12-02,Alumno,,24 16 | 15,Alumno 5,2024-12-02,Alumno,,26 17 | 16,Alumno 6,2024-12-02,Alumno,,28 18 | 17,Alumno 7,2024-12-02,Alumno,,30 19 | 18,Alumno 8,2024-12-02,Alumno,,32 20 | 19,Alumno 9,2024-12-02,Alumno,,34 21 | 20,Alumno 10,2024-12-02,Alumno,,19 22 | 21,Alumno 11,2024-12-02,Alumno,,21 23 | 22,Alumno 12,2024-12-02,Alumno,,23 24 | 23,Alumno 13,2024-12-02,Alumno,,25 25 | 24,Alumno 14,2024-12-02,Alumno,,27 26 | 25,Alumno 15,2024-12-02,Alumno,,29 27 | 26,Alumno 16,2024-12-02,Alumno,,31 28 | 27,Alumno 17,2024-12-02,Alumno,,33 29 | 28,Alumno 18,2024-12-02,Alumno,,35 30 | 29,Alumno 19,2024-12-02,Alumno,,37 31 | 30,Alumno 20,2024-12-02,Alumno,,39 32 | 31,Alumno 21,2024-12-02,Alumno,,18 33 | 32,Alumno 22,2024-12-02,Alumno,,20 34 | 33,Alumno 23,2024-12-02,Alumno,,22 35 | 34,Alumno 24,2024-12-02,Alumno,,24 36 | 35,Alumno 25,2024-12-02,Alumno,,26 37 | 36,Alumno 26,2024-12-02,Alumno,,28 38 | 37,Alumno 27,2024-12-02,Alumno,,30 39 | 38,Alumno 28,2024-12-02,Alumno,,32 40 | 39,Alumno 29,2024-12-02,Alumno,,34 41 | 40,Alumno 30,2024-12-02,Alumno,,36 42 | -------------------------------------------------------------------------------- /Practicas/moria/Enunciado.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Practicas/moria/Enunciado.pdf -------------------------------------------------------------------------------- /Practicas/productos/README.md: -------------------------------------------------------------------------------- 1 | # Practica de productos 2 | 3 | Leer el fichero del directorio "data" llamado products.csv. 4 | 5 | Procesar cada una las líneas en una lista de Productos. 6 | 7 | Un producto tiene 8 | - Int id 9 | - String name; 10 | - Int supplier; 11 | - Int category; 12 | - Double unitPrice; 13 | - Int unitsInStock; 14 | 15 | Realizar las siguientes consultas sobre dicha colección: 16 | - Todos los productos: Equivale a select * from products 17 | - Nombre de los productos: select name from products 18 | - Nombre de los productos cuyo stock es menor que 10: select name from products where units_in_stock < 10 19 | - Nombre de los productos donde el stock sea menor a 5 ordenador por unidades de stock ascendente: select name from products where units_in_stock < 5 order by units_in_stock asc 20 | - Saca el número de proveedores existentes: select count(1), supplierID from products GROUP BY supplierID 21 | - Obtener por cada producto, el numero de existencias. 22 | - Por cada proveedor, obtener el número de productos 23 | - Por cada proveedor obtener la media del precio. 24 | - Obtener el producto más caro. 25 | - Obtener los proveedores que tenga mas de 5 productos. 26 | - Obtener los proveedores cuya suma de precios supere 100. 27 | - Categorías y número de productos por categoría. 28 | - Categoría más cara. 29 | - Precio máximo, mínimo medio y cantidad por categoría. -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/.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/01-Ficheros-Texto/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | } 4 | 5 | group = "dev.joseluisgs" 6 | version = "1.0-SNAPSHOT" 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | testImplementation("org.jetbrains.kotlin:kotlin-test") 14 | } 15 | 16 | tasks.test { 17 | useJUnitPlatform() 18 | } 19 | kotlin { 20 | jvmToolchain(21) 21 | } -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/01-Ficheros-Texto/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Feb 08 16:45:42 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Ficheros-Texto" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/01-Ficheros-Texto/src/main/kotlin/Main.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs 2 | 3 | import java.io.File 4 | 5 | fun main() { 6 | // Crear un fichero en el directorio actual 7 | val file = File("file.txt") 8 | 9 | // existe 10 | if (file.exists()) { 11 | println("El fichero existe") 12 | } else { 13 | println("El fichero no existe") 14 | } 15 | 16 | // Escribir en el fichero (Si no existe lo crea) 17 | // Si existe lo sobreescribe completo OJO!!! 18 | file.writeText("Hola Mundo") 19 | 20 | // Existe, muy importante para no usar ficheros que no existen (excepciones y ahorra try-catch) 21 | if (file.exists()) { 22 | println("El fichero existe") 23 | } else { 24 | println("El fichero no existe") 25 | } 26 | 27 | // Leer el fichero completo, ojo con el tamaño 28 | val contenido = file.readText() 29 | println(contenido) 30 | 31 | // Leer el fichero por líneas, a nivel completo ojo con el tamaño 32 | val lineas = file.readLines() 33 | lineas.forEach { println(it) } 34 | 35 | // Leer el fichero por líneas e ir procesando línea a línea 36 | file.forEachLine { println(it) } 37 | 38 | // Añadir contenido al fichero 39 | file.appendText("\nAdios Mundo") 40 | 41 | // Leer el fichero completo, ojo con el tamaño 42 | val contenido2 = file.readText() 43 | println(contenido2) 44 | 45 | // Borrar el fichero 46 | file.delete() 47 | 48 | // file.forEachLine { println(it) } 49 | 50 | // Vamos a leer el fichero build.gradle.kts 51 | val buildFile = File("build.gradle.kts") 52 | if (buildFile.exists()) { 53 | var version = buildFile 54 | .readLines()// Leemos todas las líneas de un fichero como lista de Strings 55 | .first { it.contains(" kotlin(\"jvm\")") } 56 | .split("version").last() 57 | // imprimir la versión de Kotlin 58 | println("La versión de Kotlin es: ${version.replace("\"", "").trim()}") 59 | 60 | // Otra forma de leer el fichero, es una a una, ideal si fuera muy grande, porque no leemos todo el fichero 61 | buildFile.forEachLine { 62 | if (it.contains(" kotlin(\"jvm\")")) { 63 | version = it.split("version").last() 64 | println("La versión de Kotlin es: ${version.replace("\"", "").trim()}") 65 | } 66 | } 67 | 68 | } else { 69 | println("El fichero no existe") 70 | } 71 | 72 | } -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/.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/02-Ficheros-CSV/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | } 4 | 5 | group = "dev.joseluisgs" 6 | version = "1.0-SNAPSHOT" 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | testImplementation("org.jetbrains.kotlin:kotlin-test") 14 | } 15 | 16 | tasks.test { 17 | useJUnitPlatform() 18 | } 19 | kotlin { 20 | jvmToolchain(21) 21 | } -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/data/vehiculos-back.csv: -------------------------------------------------------------------------------- 1 | matricula,marca,modelo,color,precio,fechaMatriculacion,vendido,createdAt,updatedAt 2 | ABC123,Ford,Fiesta,Azul,10000.0,2021-01-15,false,2024-09-02T18:37:45,2024-09-02T18:37:45 3 | DEF456,Chevrolet,Cruze,Blanco,15000.0,2020-06-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 4 | GHI789,Toyota,Corolla,Plata,20000.0,2019-03-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 5 | JKL012,Honda,Civic,Negro,18000.0,2022-11-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 6 | MNO345,Hyundai,Elantra,Rojo,17000.0,2023-07-12,false,2024-09-02T18:37:45,2024-09-02T18:37:45 7 | PQR678,Toyota,Yaris,Amarillo,12000.0,2018-09-30,false,2024-09-02T18:37:45,2024-09-02T18:37:45 8 | STU901,Ford,Focus,Verde,14000.0,2021-12-25,false,2024-09-02T18:37:45,2024-09-02T18:37:45 9 | VWX234,Chevrolet,Spark,Azul,9000.0,2022-03-01,false,2024-09-02T18:37:45,2024-09-02T18:37:45 10 | YZA567,Hyundai,Sonata,Gris,22000.0,2023-08-18,false,2024-09-02T18:37:45,2024-09-02T18:37:45 11 | BCD890,Honda,Accord,Negro,25000.0,2022-10-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 12 | EFG123,Toyota,RAV4,Blanco,28000.0,2020-02-15,false,2024-09-02T18:37:45,2024-09-02T18:37:45 13 | HIJ456,Ford,Explorer,Plata,35000.0,2019-08-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 14 | KLM789,Chevrolet,Traverse,Azul,40000.0,2021-05-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 15 | NOP012,Hyundai,Santa Fe,Rojo,32000.0,2018-12-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 16 | QRS345,Honda,Pilot,Verde,38000.0,2023-02-25,false,2024-09-02T18:37:45,2024-09-02T18:37:45 17 | TUV678,Toyota,Highlander,Amarillo,42000.0,2017-12-30,false,2024-09-02T18:37:45,2024-09-02T18:37:45 18 | WXY901,Ford,Escape,Gris,30000.0,2023-09-15,false,2024-09-02T18:37:45,2024-09-02T18:37:45 19 | ZAB234,Chevrolet,Equinox,Negro,34000.0,2022-04-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 20 | CDE567,Hyundai,Tucson,Blanco,26000.0,2021-11-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 21 | FGH890,Honda,CR-V,Plata,30000.0,2020-07-12,false,2024-09-02T18:37:45,2024-09-02T18:37:45 22 | -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/data/vehiculos.csv: -------------------------------------------------------------------------------- 1 | matricula,marca,modelo,color,precio,fechaMatriculacion,vendido,createdAt,updatedAt 2 | ABC123,Ford,Fiesta,Azul,10000,2021-01-15,false,2024-09-02T18:37:45,2024-09-02T18:37:45 3 | DEF456,Chevrolet,Cruze,Blanco,15000,2020-06-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 4 | GHI789,Toyota,Corolla,Plata,20000,2019-03-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 5 | JKL012,Honda,Civic,Negro,18000,2022-11-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 6 | MNO345,Hyundai,Elantra,Rojo,17000,2023-07-12,false,2024-09-02T18:37:45,2024-09-02T18:37:45 7 | PQR678,Toyota,Yaris,Amarillo,12000,2018-09-30,false,2024-09-02T18:37:45,2024-09-02T18:37:45 8 | STU901,Ford,Focus,Verde,14000,2021-12-25,false,2024-09-02T18:37:45,2024-09-02T18:37:45 9 | VWX234,Chevrolet,Spark,Azul,9000,2022-03-01,false,2024-09-02T18:37:45,2024-09-02T18:37:45 10 | YZA567,Hyundai,Sonata,Gris,22000,2023-08-18,false,2024-09-02T18:37:45,2024-09-02T18:37:45 11 | BCD890,Honda,Accord,Negro,25000,2022-10-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 12 | EFG123,Toyota,RAV4,Blanco,28000,2020-02-15,false,2024-09-02T18:37:45,2024-09-02T18:37:45 13 | HIJ456,Ford,Explorer,Plata,35000,2019-08-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 14 | KLM789,Chevrolet,Traverse,Azul,40000,2021-05-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 15 | NOP012,Hyundai,Santa Fe,Rojo,32000,2018-12-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 16 | QRS345,Honda,Pilot,Verde,38000,2023-02-25,false,2024-09-02T18:37:45,2024-09-02T18:37:45 17 | TUV678,Toyota,Highlander,Amarillo,42000,2017-12-30,false,2024-09-02T18:37:45,2024-09-02T18:37:45 18 | WXY901,Ford,Escape,Gris,30000,2023-09-15,false,2024-09-02T18:37:45,2024-09-02T18:37:45 19 | ZAB234,Chevrolet,Equinox,Negro,34000,2022-04-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 20 | CDE567,Hyundai,Tucson,Blanco,26000,2021-11-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 21 | FGH890,Honda,CR-V,Plata,30000,2020-07-12,false,2024-09-02T18:37:45,2024-09-02T18:37:45 22 | -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/02-Ficheros-CSV/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Feb 09 18:38:20 GMT+01:00 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Ficheros-CSV" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/src/main/kotlin/Main.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs 2 | 3 | import dev.joseluisgs.models.Vehiculo 4 | import java.time.LocalDate 5 | import java.time.LocalDateTime 6 | import kotlin.io.path.* 7 | 8 | fun main() { 9 | val actualDir = System.getProperty("user.dir") 10 | println("El directorio actual es: $actualDir") 11 | 12 | val databaseDir = Path(actualDir, "data") 13 | 14 | // Existe y es un directorio 15 | if (databaseDir.exists() && databaseDir.isDirectory()) { 16 | println("El directorio de la base de datos existe") 17 | } else { 18 | println("El directorio de la base de datos no existe") 19 | } 20 | 21 | val dataFile = Path(databaseDir.toString(), "vehiculos.csv") 22 | 23 | // Existe y es un archivo 24 | if (dataFile.exists() && !dataFile.isDirectory() && dataFile.extension == "csv" && dataFile.isReadable()) { 25 | println("El archivo de la base de datos existe") 26 | } else { 27 | println("El archivo de la base de datos no existe") 28 | } 29 | 30 | // Lo leemos 31 | 32 | val vehiculos = dataFile.readLines() 33 | .drop(1)// Quitamos la cabecera 34 | .map { line -> line.split(",") } 35 | .map { parts -> 36 | Vehiculo( 37 | matricula = parts[0], 38 | marca = parts[1], 39 | modelo = parts[2], 40 | color = parts[3], 41 | precio = parts[4].toDouble(), 42 | fechaMatriculacion = LocalDate.parse(parts[5]), 43 | vendido = parts[6].toBoolean(), 44 | createdAt = LocalDateTime.parse(parts[7]), 45 | updatedAt = LocalDateTime.parse(parts[8]) 46 | ) 47 | } 48 | 49 | vehiculos.forEach { println(it) } 50 | 51 | // Escribimos un fichero csv con los datos de los vehiculos 52 | val vehiculosFile = Path(databaseDir.toString(), "vehiculos-back.csv") 53 | vehiculosFile.writeText("matricula,marca,modelo,color,precio,fechaMatriculacion,vendido,createdAt,updatedAt\n") 54 | vehiculos.forEach { 55 | vehiculosFile.appendText( 56 | "${it.matricula},${it.marca},${it.modelo},${it.color},${it.precio},${it.fechaMatriculacion},${it.vendido},${it.createdAt},${it.updatedAt}\n", 57 | ) 58 | } 59 | 60 | // Comprobamos que se ha escrito bien 61 | 62 | } 63 | 64 | -------------------------------------------------------------------------------- /Soluciones/02-Ficheros-CSV/src/main/kotlin/models/Vehiculo.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import java.time.LocalDate 4 | import java.time.LocalDateTime 5 | 6 | /** 7 | * Modelo de Vehiculo 8 | */ 9 | data class Vehiculo( 10 | val matricula: String, 11 | val marca: String, 12 | val modelo: String, 13 | val color: String, 14 | val precio: Double, 15 | val fechaMatriculacion: LocalDate, 16 | val vendido: Boolean = false, 17 | val createdAt: LocalDateTime = LocalDateTime.now(), 18 | val updatedAt: LocalDateTime = LocalDateTime.now() 19 | ) -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/.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/03-Ficheros-CSV-DTO/.idea/.name: -------------------------------------------------------------------------------- 1 | Ficheros-CSV -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | } 4 | 5 | group = "dev.joseluisgs" 6 | version = "1.0-SNAPSHOT" 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | testImplementation("org.jetbrains.kotlin:kotlin-test") 14 | } 15 | 16 | tasks.test { 17 | useJUnitPlatform() 18 | } 19 | kotlin { 20 | jvmToolchain(21) 21 | } -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/data/vehiculos-back.csv: -------------------------------------------------------------------------------- 1 | matricula;marca;modelo;color;precio;fechaMatriculacion;vendido;createdAt;updatedAt 2 | ABC123;Ford;Fiesta;Azul;10.000,00 €;2021-01-15;Si;2024-09-02T18:37:45;2024-09-02T18:37:45 3 | DEF456;Chevrolet;Cruze;Blanco;15.000,00 €;2020-06-20;No;2024-09-02T18:37:45;2024-09-02T18:37:45 4 | GHI789;Toyota;Corolla;Plata;20.000,00 €;2019-03-10;No;2024-09-02T18:37:45;2024-09-02T18:37:45 5 | JKL012;Honda;Civic;Negro;18.000,00 €;2022-11-05;No;2024-09-02T18:37:45;2024-09-02T18:37:45 6 | MNO345;Hyundai;Elantra;Rojo;17.000,00 €;2023-07-12;No;2024-09-02T18:37:45;2024-09-02T18:37:45 7 | PQR678;Toyota;Yaris;Amarillo;12.000,00 €;2018-09-30;No;2024-09-02T18:37:45;2024-09-02T18:37:45 8 | STU901;Ford;Focus;Verde;14.000,00 €;2021-12-25;No;2024-09-02T18:37:45;2024-09-02T18:37:45 9 | VWX234;Chevrolet;Spark;Azul;9.000,00 €;2022-03-01;No;2024-09-02T18:37:45;2024-09-02T18:37:45 10 | YZA567;Hyundai;Sonata;Gris;22.000,00 €;2023-08-18;No;2024-09-02T18:37:45;2024-09-02T18:37:45 11 | BCD890;Honda;Accord;Negro;25.000,00 €;2022-10-10;No;2024-09-02T18:37:45;2024-09-02T18:37:45 12 | EFG123;Toyota;RAV4;Blanco;28.000,00 €;2020-02-15;No;2024-09-02T18:37:45;2024-09-02T18:37:45 13 | HIJ456;Ford;Explorer;Plata;35.000,00 €;2019-08-20;No;2024-09-02T18:37:45;2024-09-02T18:37:45 14 | KLM789;Chevrolet;Traverse;Azul;40.000,00 €;2021-05-05;No;2024-09-02T18:37:45;2024-09-02T18:37:45 15 | NOP012;Hyundai;Santa Fe;Rojo;32.000,00 €;2018-12-10;No;2024-09-02T18:37:45;2024-09-02T18:37:45 16 | QRS345;Honda;Pilot;Verde;38.000,00 €;2023-02-25;No;2024-09-02T18:37:45;2024-09-02T18:37:45 17 | TUV678;Toyota;Highlander;Amarillo;42.000,00 €;2017-12-30;No;2024-09-02T18:37:45;2024-09-02T18:37:45 18 | WXY901;Ford;Escape;Gris;30.000,00 €;2023-09-15;No;2024-09-02T18:37:45;2024-09-02T18:37:45 19 | ZAB234;Chevrolet;Equinox;Negro;34.000,00 €;2022-04-20;No;2024-09-02T18:37:45;2024-09-02T18:37:45 20 | CDE567;Hyundai;Tucson;Blanco;26.000,00 €;2021-11-05;No;2024-09-02T18:37:45;2024-09-02T18:37:45 21 | FGH890;Honda;CR-V;Plata;30.000,00 €;2020-07-12;Si;2024-09-02T18:37:45;2024-09-02T18:37:45 22 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/data/vehiculos.csv: -------------------------------------------------------------------------------- 1 | matricula,marca,modelo,color,precio,fechaMatriculacion,vendido,createdAt,updatedAt 2 | ABC123,Ford,Fiesta,Azul,10000,2021-01-15,true,2024-09-02T18:37:45,2024-09-02T18:37:45 3 | DEF456,Chevrolet,Cruze,Blanco,15000,2020-06-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 4 | GHI789,Toyota,Corolla,Plata,20000,2019-03-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 5 | JKL012,Honda,Civic,Negro,18000,2022-11-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 6 | MNO345,Hyundai,Elantra,Rojo,17000,2023-07-12,false,2024-09-02T18:37:45,2024-09-02T18:37:45 7 | PQR678,Toyota,Yaris,Amarillo,12000,2018-09-30,false,2024-09-02T18:37:45,2024-09-02T18:37:45 8 | STU901,Ford,Focus,Verde,14000,2021-12-25,false,2024-09-02T18:37:45,2024-09-02T18:37:45 9 | VWX234,Chevrolet,Spark,Azul,9000,2022-03-01,false,2024-09-02T18:37:45,2024-09-02T18:37:45 10 | YZA567,Hyundai,Sonata,Gris,22000,2023-08-18,false,2024-09-02T18:37:45,2024-09-02T18:37:45 11 | BCD890,Honda,Accord,Negro,25000,2022-10-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 12 | EFG123,Toyota,RAV4,Blanco,28000,2020-02-15,false,2024-09-02T18:37:45,2024-09-02T18:37:45 13 | HIJ456,Ford,Explorer,Plata,35000,2019-08-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 14 | KLM789,Chevrolet,Traverse,Azul,40000,2021-05-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 15 | NOP012,Hyundai,Santa Fe,Rojo,32000,2018-12-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 16 | QRS345,Honda,Pilot,Verde,38000,2023-02-25,false,2024-09-02T18:37:45,2024-09-02T18:37:45 17 | TUV678,Toyota,Highlander,Amarillo,42000,2017-12-30,false,2024-09-02T18:37:45,2024-09-02T18:37:45 18 | WXY901,Ford,Escape,Gris,30000,2023-09-15,false,2024-09-02T18:37:45,2024-09-02T18:37:45 19 | ZAB234,Chevrolet,Equinox,Negro,34000,2022-04-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 20 | CDE567,Hyundai,Tucson,Blanco,26000,2021-11-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 21 | FGH890,Honda,CR-V,Plata,30000,2020-07-12,true,2024-09-02T18:37:45,2024-09-02T18:37:45 22 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/03-Ficheros-CSV-DTO/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Feb 09 18:38:20 GMT+01:00 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Ficheros-CSV" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/src/main/kotlin/Main.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs 2 | 3 | import dev.joseluisgs.dto.VehiculoDto 4 | import dev.joseluisgs.mappers.toDto 5 | import dev.joseluisgs.mappers.toModel 6 | import kotlin.io.path.* 7 | 8 | fun main() { 9 | val actualDir = System.getProperty("user.dir") 10 | println("El directorio actual es: $actualDir") 11 | 12 | val databaseDir = Path(actualDir, "data") 13 | 14 | // Existe y es un directorio 15 | if (databaseDir.exists() && databaseDir.isDirectory()) { 16 | println("El directorio de la base de datos existe") 17 | } else { 18 | println("El directorio de la base de datos no existe") 19 | } 20 | 21 | val dataFile = Path(databaseDir.toString(), "vehiculos.csv") 22 | 23 | // Existe y es un archivo 24 | if (dataFile.exists() && !dataFile.isDirectory() && dataFile.extension == "csv" && dataFile.isReadable()) { 25 | println("El archivo de la base de datos existe") 26 | } else { 27 | println("El archivo de la base de datos no existe") 28 | } 29 | 30 | // Lo leemos 31 | 32 | val vehiculos = dataFile.readLines() 33 | .drop(1)// Quitamos la cabecera 34 | .map { line -> line.split(",") } 35 | .map { parts -> 36 | VehiculoDto( 37 | matricula = parts[0], 38 | marca = parts[1], 39 | modelo = parts[2], 40 | color = parts[3], 41 | precio = parts[4], 42 | fechaMatriculacion = parts[5], 43 | vendido = parts[6], 44 | createdAt = parts[7], 45 | updatedAt = parts[8], 46 | ) 47 | }.map { 48 | it.toModel() 49 | } 50 | 51 | vehiculos.forEach { println(it) } 52 | 53 | // Escribimos un fichero csv con los datos de los vehiculos 54 | val vehiculosFile = Path(databaseDir.toString(), "vehiculos-back.csv") 55 | vehiculosFile.writeText("matricula;marca;modelo;color;precio;fechaMatriculacion;vendido;createdAt;updatedAt\n") 56 | vehiculos.map { 57 | it.toDto() 58 | }.forEach { 59 | vehiculosFile.appendText( 60 | "${it.matricula};${it.marca};${it.modelo};${it.color};${it.precio};${it.fechaMatriculacion};${it.vendido};${it.createdAt};${it.updatedAt}\n", 61 | ) 62 | } 63 | 64 | // Comprobamos que se ha escrito bien 65 | 66 | } 67 | 68 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/src/main/kotlin/dto/VehiculoDto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.dto 2 | 3 | data class VehiculoDto( 4 | val matricula: String, 5 | val marca: String, 6 | val modelo: String, 7 | val color: String, 8 | val precio: String, 9 | val fechaMatriculacion: String, 10 | val vendido: String, 11 | val createdAt: String, 12 | val updatedAt: String, 13 | ) 14 | -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/src/main/kotlin/mappers/VehiculoMapper.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.mappers 2 | 3 | import dev.joseluisgs.dto.VehiculoDto 4 | import dev.joseluisgs.models.Vehiculo 5 | import java.text.NumberFormat 6 | import java.time.LocalDate 7 | import java.time.LocalDateTime 8 | import java.util.* 9 | 10 | fun Vehiculo.toDto(): VehiculoDto { 11 | return VehiculoDto( 12 | matricula = this.matricula, 13 | marca = this.marca, 14 | modelo = this.modelo, 15 | color = this.color, 16 | precio = this.precio.toLocalMoney(), 17 | fechaMatriculacion = this.fechaMatriculacion.toString(), 18 | vendido = if (this.vendido) "Si" else "No", 19 | createdAt = this.createdAt.toString(), 20 | updatedAt = this.updatedAt.toString() 21 | ) 22 | } 23 | 24 | fun VehiculoDto.toModel(): Vehiculo { 25 | return Vehiculo( 26 | matricula = this.matricula, 27 | marca = this.marca, 28 | modelo = this.modelo, 29 | color = this.color, 30 | precio = this.precio.toDouble(), 31 | fechaMatriculacion = LocalDate.parse(this.fechaMatriculacion), 32 | vendido = this.vendido.toBooleanStrict(), 33 | createdAt = LocalDateTime.parse(this.createdAt), 34 | updatedAt = LocalDateTime.parse(this.updatedAt) 35 | ) 36 | } 37 | 38 | fun Double.toLocalMoney(): String { 39 | return NumberFormat.getCurrencyInstance(Locale("es", "ES")).format(this) 40 | } -------------------------------------------------------------------------------- /Soluciones/03-Ficheros-CSV-DTO/src/main/kotlin/models/Vehiculo.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import java.time.LocalDate 4 | import java.time.LocalDateTime 5 | 6 | /** 7 | * Modelo de Vehiculo 8 | */ 9 | data class Vehiculo( 10 | val matricula: String, 11 | val marca: String, 12 | val modelo: String, 13 | val color: String, 14 | val precio: Double, 15 | val fechaMatriculacion: LocalDate, 16 | val vendido: Boolean, 17 | val createdAt: LocalDateTime = LocalDateTime.now(), 18 | val updatedAt: LocalDateTime = LocalDateTime.now() 19 | ) -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/.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/04-Aula-CSV-Resources/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | } 4 | 5 | group = "dev.joseluisgs" 6 | version = "1.0-SNAPSHOT" 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | testImplementation("org.jetbrains.kotlin:kotlin-test") 14 | } 15 | 16 | tasks.test { 17 | useJUnitPlatform() 18 | } 19 | kotlin { 20 | jvmToolchain(21) 21 | } -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/04-Aula-CSV-Resources/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 13 16:37:23 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Aula-CSV" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/src/main/kotlin/dto/PersonasDto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.dto 2 | 3 | data class PersonasDto( 4 | val id: String, 5 | val nombre: String, 6 | val createdAt: String, 7 | val tipo: String, 8 | val modulo: String?, 9 | val edad: String? 10 | ) 11 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/src/main/kotlin/mappers/PersonaMapper.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.mappers 2 | 3 | import dev.joseluisgs.dto.PersonasDto 4 | import dev.joseluisgs.models.Docente 5 | import dev.joseluisgs.models.Estudiante 6 | import dev.joseluisgs.models.Persona 7 | 8 | fun PersonasDto.toPersona(): Persona { 9 | return when (this.tipo) { 10 | "Alumno" -> Estudiante(this.nombre, this.edad?.toInt() ?: 0) 11 | "Profesor" -> Docente(this.nombre, this.modulo ?: "") 12 | else -> throw IllegalArgumentException("Tipo de persona no soportado") 13 | } 14 | } -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/src/main/kotlin/models/Docente.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | class Docente(nombre: String, val modulo: String) : Persona(nombre) { 4 | override fun toString(): String { 5 | return "Docente(nombre=$nombre, modulo=$modulo)" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/src/main/kotlin/models/Estudiante.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | class Estudiante(nombre: String, val edad: Int) : Persona(nombre) { 4 | override fun toString(): String { 5 | return "Estudiante(nombre=$nombre, edad=$edad)" 6 | } 7 | } -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/src/main/kotlin/models/Persona.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | abstract class Persona(val nombre: String) 4 | 5 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/src/main/resources/README.md: -------------------------------------------------------------------------------- 1 | # Herencia, DTO y Ficheros 2 | 3 | Dada esta estructura 4 | - Persona(nombre: String) 5 | - Profesor(modulo: String): Persona 6 | - Alumno(edad: Int): Persona 7 | 8 | Leer el fichero personas.csv que puede estar en a carpeta "resources" (o "data") 9 | 10 | Consultas: 11 | - Profesor más mayor 12 | - Alumno más joven 13 | - Media de edad de alumnos 14 | - Media de longitud de nombre 15 | - Listado de agrupados por tipo 16 | - Listado de profesores de programación 17 | - Agrupados por edad, numero de alumnos 18 | - Agrupados por modulo, numero de profesores 19 | - Agrupados por edad, obtener la longitud de nombre. 20 | - Agrupados por edad, obtener el nombre mas largo. 21 | 22 | Escribir en un fichero llamado profesores.csv, solo los datos de los profesores en la carpeta "output" 23 | -------------------------------------------------------------------------------- /Soluciones/04-Aula-CSV-Resources/src/main/resources/personas.csv: -------------------------------------------------------------------------------- 1 | id,nombre,createdAt,tipo,modulo,edad 2 | 1,Profesor 1,2024-12-02,Profesor,Programación, 3 | 2,Profesor 2,2024-12-02,Profesor,Entornos, 4 | 3,Profesor 3,2024-12-02,Profesor,Programación, 5 | 4,Profesor 4,2024-12-02,Profesor,Entornos, 6 | 5,Profesor 5,2024-12-02,Profesor,Programación, 7 | 6,Profesor 6,2024-12-02,Profesor,Entornos, 8 | 7,Profesor 7,2024-12-02,Profesor,Programación, 9 | 8,Profesor 8,2024-12-02,Profesor,Entornos, 10 | 9,Profesor 9,2024-12-02,Profesor,Programación, 11 | 10,Profesor 10,2024-12-02,Profesor,Entornos, 12 | 11,Alumno 1,2024-12-02,Alumno,,18 13 | 12,Alumno 2,2024-12-02,Alumno,,20 14 | 13,Alumno 3,2024-12-02,Alumno,,22 15 | 14,Alumno 4,2024-12-02,Alumno,,24 16 | 15,Alumno 5,2024-12-02,Alumno,,26 17 | 16,Alumno 6,2024-12-02,Alumno,,28 18 | 17,Alumno 7,2024-12-02,Alumno,,30 19 | 18,Alumno 8,2024-12-02,Alumno,,32 20 | 19,Alumno 9,2024-12-02,Alumno,,34 21 | 20,Alumno 10,2024-12-02,Alumno,,19 22 | 21,Alumno 11,2024-12-02,Alumno,,21 23 | 22,Alumno 12,2024-12-02,Alumno,,23 24 | 23,Alumno 13,2024-12-02,Alumno,,25 25 | 24,Alumno 14,2024-12-02,Alumno,,27 26 | 25,Alumno 15,2024-12-02,Alumno,,29 27 | 26,Alumno 16,2024-12-02,Alumno,,31 28 | 27,Alumno 17,2024-12-02,Alumno,,33 29 | 28,Alumno 18,2024-12-02,Alumno,,35 30 | 29,Alumno 19,2024-12-02,Alumno,,37 31 | 30,Alumno 20,2024-12-02,Alumno,,39 32 | 31,Alumno 21,2024-12-02,Alumno,,18 33 | 32,Alumno 22,2024-12-02,Alumno,,20 34 | 33,Alumno 23,2024-12-02,Alumno,,22 35 | 34,Alumno 24,2024-12-02,Alumno,,24 36 | 35,Alumno 25,2024-12-02,Alumno,,26 37 | 36,Alumno 26,2024-12-02,Alumno,,28 38 | 37,Alumno 27,2024-12-02,Alumno,,30 39 | 38,Alumno 28,2024-12-02,Alumno,,32 40 | 39,Alumno 29,2024-12-02,Alumno,,34 41 | 40,Alumno 30,2024-12-02,Alumno,,36 42 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/.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/05-Ficheros-JSON-DTO/.idea/.name: -------------------------------------------------------------------------------- 1 | Ficheros-CSV -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | kotlin("plugin.serialization") version "1.9.22" 4 | } 5 | 6 | group = "dev.joseluisgs" 7 | version = "1.0-SNAPSHOT" 8 | 9 | repositories { 10 | mavenCentral() 11 | } 12 | 13 | dependencies { 14 | implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") 15 | testImplementation("org.jetbrains.kotlin:kotlin-test") 16 | } 17 | 18 | tasks.test { 19 | useJUnitPlatform() 20 | } 21 | kotlin { 22 | jvmToolchain(21) 23 | } -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/data/vehiculos.csv: -------------------------------------------------------------------------------- 1 | matricula,marca,modelo,color,precio,fechaMatriculacion,vendido,createdAt,updatedAt 2 | ABC123,Ford,Fiesta,Azul,10000,2021-01-15,true,2024-09-02T18:37:45,2024-09-02T18:37:45 3 | DEF456,Chevrolet,Cruze,Blanco,15000,2020-06-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 4 | GHI789,Toyota,Corolla,Plata,20000,2019-03-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 5 | JKL012,Honda,Civic,Negro,18000,2022-11-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 6 | MNO345,Hyundai,Elantra,Rojo,17000,2023-07-12,false,2024-09-02T18:37:45,2024-09-02T18:37:45 7 | PQR678,Toyota,Yaris,Amarillo,12000,2018-09-30,false,2024-09-02T18:37:45,2024-09-02T18:37:45 8 | STU901,Ford,Focus,Verde,14000,2021-12-25,false,2024-09-02T18:37:45,2024-09-02T18:37:45 9 | VWX234,Chevrolet,Spark,Azul,9000,2022-03-01,false,2024-09-02T18:37:45,2024-09-02T18:37:45 10 | YZA567,Hyundai,Sonata,Gris,22000,2023-08-18,false,2024-09-02T18:37:45,2024-09-02T18:37:45 11 | BCD890,Honda,Accord,Negro,25000,2022-10-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 12 | EFG123,Toyota,RAV4,Blanco,28000,2020-02-15,false,2024-09-02T18:37:45,2024-09-02T18:37:45 13 | HIJ456,Ford,Explorer,Plata,35000,2019-08-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 14 | KLM789,Chevrolet,Traverse,Azul,40000,2021-05-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 15 | NOP012,Hyundai,Santa Fe,Rojo,32000,2018-12-10,false,2024-09-02T18:37:45,2024-09-02T18:37:45 16 | QRS345,Honda,Pilot,Verde,38000,2023-02-25,false,2024-09-02T18:37:45,2024-09-02T18:37:45 17 | TUV678,Toyota,Highlander,Amarillo,42000,2017-12-30,false,2024-09-02T18:37:45,2024-09-02T18:37:45 18 | WXY901,Ford,Escape,Gris,30000,2023-09-15,false,2024-09-02T18:37:45,2024-09-02T18:37:45 19 | ZAB234,Chevrolet,Equinox,Negro,34000,2022-04-20,false,2024-09-02T18:37:45,2024-09-02T18:37:45 20 | CDE567,Hyundai,Tucson,Blanco,26000,2021-11-05,false,2024-09-02T18:37:45,2024-09-02T18:37:45 21 | FGH890,Honda,CR-V,Plata,30000,2020-07-12,true,2024-09-02T18:37:45,2024-09-02T18:37:45 22 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/05-Ficheros-JSON-DTO/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Feb 09 18:38:20 GMT+01:00 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Ficheros-CSV" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/src/main/kotlin/Main.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs 2 | 3 | import dev.joseluisgs.dto.VehiculoDto 4 | import dev.joseluisgs.mappers.toModel 5 | import kotlinx.serialization.encodeToString 6 | import kotlinx.serialization.json.Json 7 | import kotlin.io.path.* 8 | 9 | private val json = Json { prettyPrint = true } 10 | 11 | fun main() { 12 | val actualDir = System.getProperty("user.dir") 13 | val dataFile = Path(actualDir, "data", "vehiculos.csv") 14 | 15 | // Existe y es un archivo 16 | if (dataFile.exists() && !dataFile.isDirectory() && dataFile.extension == "csv" && dataFile.isReadable()) { 17 | println("El archivo de la base de datos existe") 18 | } else { 19 | println("El archivo de la base de datos no existe") 20 | } 21 | 22 | // Lo leemos 23 | 24 | val vehiculos = dataFile.readLines() 25 | .drop(1)// Quitamos la cabecera 26 | .map { line -> line.split(",") } 27 | .map { parts -> 28 | VehiculoDto( 29 | matricula = parts[0], 30 | marca = parts[1], 31 | modelo = parts[2], 32 | color = parts[3], 33 | precio = parts[4], 34 | fechaMatriculacion = parts[5], 35 | vendido = parts[6], 36 | createdAt = parts[7], 37 | updatedAt = parts[8], 38 | ) 39 | } 40 | 41 | vehiculos.forEach { println(it) } 42 | 43 | // Creamos el JSON 44 | // val jsonString = Json.encodeToString>(vehiculos) 45 | // prettyPrint 46 | val jsonString = Json { prettyPrint = true }.encodeToString>(vehiculos) 47 | println(jsonString) 48 | 49 | // Salvamos en un archivo 50 | val jsonFile = Path(actualDir, "data", "vehiculos.json") 51 | jsonFile.writeText(jsonString) 52 | 53 | // Leemos el JSON 54 | val jsonVehiculos = jsonFile.readText() 55 | println(jsonVehiculos) 56 | val jsonVehiculosDto = Json.decodeFromString>(jsonVehiculos) 57 | val listaVehiculos = jsonVehiculosDto.map { it.toModel() } 58 | listaVehiculos.forEach { println(it) } 59 | } 60 | 61 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/src/main/kotlin/dto/VehiculoDto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.dto 2 | 3 | import kotlinx.serialization.SerialName 4 | import kotlinx.serialization.Serializable 5 | 6 | @Serializable 7 | data class VehiculoDto( 8 | val matricula: String, 9 | val marca: String, 10 | val modelo: String, 11 | val color: String, 12 | val precio: String, 13 | @SerialName("fecha_matriculacion") 14 | val fechaMatriculacion: String, 15 | val vendido: String, 16 | val createdAt: String, 17 | val updatedAt: String, 18 | ) 19 | -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/src/main/kotlin/mappers/VehiculoMapper.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.mappers 2 | 3 | import dev.joseluisgs.dto.VehiculoDto 4 | import dev.joseluisgs.models.Vehiculo 5 | import java.text.NumberFormat 6 | import java.time.LocalDate 7 | import java.time.LocalDateTime 8 | import java.util.* 9 | 10 | fun Vehiculo.toDto(): VehiculoDto { 11 | return VehiculoDto( 12 | matricula = this.matricula, 13 | marca = this.marca, 14 | modelo = this.modelo, 15 | color = this.color, 16 | precio = this.precio.toLocalMoney(), 17 | fechaMatriculacion = this.fechaMatriculacion.toString(), 18 | vendido = if (this.vendido) "Si" else "No", 19 | createdAt = this.createdAt.toString(), 20 | updatedAt = this.updatedAt.toString() 21 | ) 22 | } 23 | 24 | fun VehiculoDto.toModel(): Vehiculo { 25 | return Vehiculo( 26 | matricula = this.matricula, 27 | marca = this.marca, 28 | modelo = this.modelo, 29 | color = this.color, 30 | precio = this.precio.toDouble(), 31 | fechaMatriculacion = LocalDate.parse(this.fechaMatriculacion), 32 | vendido = this.vendido.toBooleanStrict(), 33 | createdAt = LocalDateTime.parse(this.createdAt), 34 | updatedAt = LocalDateTime.parse(this.updatedAt) 35 | ) 36 | } 37 | 38 | fun Double.toLocalMoney(): String { 39 | return NumberFormat.getCurrencyInstance(Locale("es", "ES")).format(this) 40 | } -------------------------------------------------------------------------------- /Soluciones/05-Ficheros-JSON-DTO/src/main/kotlin/models/Vehiculo.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import java.time.LocalDate 4 | import java.time.LocalDateTime 5 | 6 | /** 7 | * Modelo de Vehiculo 8 | */ 9 | data class Vehiculo( 10 | val matricula: String, 11 | val marca: String, 12 | val modelo: String, 13 | val color: String, 14 | val precio: Double, 15 | val fechaMatriculacion: LocalDate, 16 | val vendido: Boolean, 17 | val createdAt: LocalDateTime = LocalDateTime.now(), 18 | val updatedAt: LocalDateTime = LocalDateTime.now() 19 | ) -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/.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/06-Aula-JSON-Resources/.idea/.name: -------------------------------------------------------------------------------- 1 | Aula-CSV -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | kotlin("plugin.serialization") version "1.9.22" 4 | } 5 | 6 | group = "dev.joseluisgs" 7 | version = "1.0-SNAPSHOT" 8 | 9 | repositories { 10 | mavenCentral() 11 | } 12 | 13 | dependencies { 14 | implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") 15 | testImplementation("org.jetbrains.kotlin:kotlin-test") 16 | } 17 | 18 | tasks.test { 19 | useJUnitPlatform() 20 | } 21 | kotlin { 22 | jvmToolchain(21) 23 | } -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/06-Aula-JSON-Resources/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 13 16:37:23 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Aula-CSV" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/dto/DocenteDto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.dto 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class DocenteDto( 7 | val nombre: String, 8 | val modulo: String 9 | ) -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/dto/EstudianteDto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.dto 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class EstudianteDto( 7 | val nombre: String, 8 | val edad: String 9 | ) -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/dto/InformeDto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.dto 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class InformeDto( 7 | val docentes: List, 8 | val estudiantes: List 9 | ) 10 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/dto/PersonasDto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.dto 2 | 3 | data class PersonasDto( 4 | val id: String, 5 | val nombre: String, 6 | val createdAt: String, 7 | val tipo: String, 8 | val modulo: String?, 9 | val edad: String? 10 | ) 11 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/import/DocenteImportDto.kt: -------------------------------------------------------------------------------- 1 | package import 2 | 3 | 4 | import dev.joseluisgs.models.Docente 5 | import kotlinx.serialization.SerialName 6 | import kotlinx.serialization.Serializable 7 | 8 | @Serializable 9 | data class DocenteImportDto( 10 | @SerialName("modulo") 11 | val modulo: String, 12 | @SerialName("nombre") 13 | val nombre: String 14 | ) 15 | 16 | fun DocenteImportDto.toDocente(): Docente { 17 | return Docente(this.modulo, this.nombre) 18 | } -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/import/EstudianteImportDto.kt: -------------------------------------------------------------------------------- 1 | package import 2 | 3 | 4 | import dev.joseluisgs.models.Estudiante 5 | import kotlinx.serialization.SerialName 6 | import kotlinx.serialization.Serializable 7 | 8 | @Serializable 9 | data class EstudianteImportDto( 10 | @SerialName("edad") 11 | val edad: String, 12 | @SerialName("nombre") 13 | val nombre: String 14 | ) 15 | 16 | fun EstudianteImportDto.toEstudiante(): Estudiante { 17 | return Estudiante(this.nombre, this.edad.toInt()) 18 | } -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/import/ImportDto.kt: -------------------------------------------------------------------------------- 1 | package import 2 | 3 | 4 | import kotlinx.serialization.SerialName 5 | import kotlinx.serialization.Serializable 6 | 7 | @Serializable 8 | data class ImportDto( 9 | @SerialName("docentes") 10 | val docentes: List, 11 | @SerialName("estudiantes") 12 | val estudiantes: List 13 | ) -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/mappers/PersonaMapper.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.mappers 2 | 3 | import dev.joseluisgs.dto.DocenteDto 4 | import dev.joseluisgs.dto.EstudianteDto 5 | import dev.joseluisgs.dto.PersonasDto 6 | import dev.joseluisgs.models.Docente 7 | import dev.joseluisgs.models.Estudiante 8 | import dev.joseluisgs.models.Persona 9 | 10 | fun PersonasDto.toPersona(): Persona { 11 | return when (this.tipo) { 12 | "Alumno" -> Estudiante(this.nombre, this.edad?.toInt() ?: 0) 13 | "Profesor" -> Docente(this.nombre, this.modulo ?: "") 14 | else -> throw IllegalArgumentException("Tipo de persona no soportado") 15 | } 16 | } 17 | 18 | fun Docente.toDocenteDto(): DocenteDto { 19 | return DocenteDto(this.nombre, this.modulo) 20 | } 21 | 22 | fun DocenteDto.toDocente(): Docente { 23 | return Docente(this.nombre, this.modulo) 24 | } 25 | 26 | fun Estudiante.toEstudianteDto(): EstudianteDto { 27 | return EstudianteDto(this.nombre, this.edad.toString()) 28 | } 29 | 30 | fun EstudianteDto.toEstudiante(): Estudiante { 31 | return Estudiante(this.nombre, this.edad.toInt()) 32 | } 33 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/models/Docente.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | class Docente(nombre: String, val modulo: String) : Persona(nombre) { 4 | override fun toString(): String { 5 | return "Docente(nombre=$nombre, modulo=$modulo)" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/models/Estudiante.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | 4 | class Estudiante(nombre: String, val edad: Int) : Persona(nombre) { 5 | override fun toString(): String { 6 | return "Estudiante(nombre=$nombre, edad=$edad)" 7 | } 8 | } -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/kotlin/models/Persona.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | abstract class Persona(val nombre: String) 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/resources/README.md: -------------------------------------------------------------------------------- 1 | # Herencia, DTO y Ficheros 2 | 3 | Dada esta estructura 4 | - Persona(nombre: String) 5 | - Profesor(modulo: String): Persona 6 | - Alumno(edad: Int): Persona 7 | 8 | Leer el fichero personas.csv que puede estar en a carpeta "resources" (o "data") 9 | 10 | Consultas: 11 | - Profesor más mayor 12 | - Alumno más joven 13 | - Media de edad de alumnos 14 | - Media de longitud de nombre 15 | - Listado de agrupados por tipo 16 | - Listado de profesores de programación 17 | - Agrupados por edad, numero de alumnos 18 | - Agrupados por modulo, numero de profesores 19 | - Agrupados por edad, obtener la longitud de nombre. 20 | - Agrupados por edad, obtener el nombre mas largo. 21 | 22 | Escribir en un fichero llamado profesores.csv, solo los datos de los profesores en la carpeta "output" 23 | -------------------------------------------------------------------------------- /Soluciones/06-Aula-JSON-Resources/src/main/resources/personas.csv: -------------------------------------------------------------------------------- 1 | id,nombre,createdAt,tipo,modulo,edad 2 | 1,Profesor 1,2024-12-02,Profesor,Programación, 3 | 2,Profesor 2,2024-12-02,Profesor,Entornos, 4 | 3,Profesor 3,2024-12-02,Profesor,Programación, 5 | 4,Profesor 4,2024-12-02,Profesor,Entornos, 6 | 5,Profesor 5,2024-12-02,Profesor,Programación, 7 | 6,Profesor 6,2024-12-02,Profesor,Entornos, 8 | 7,Profesor 7,2024-12-02,Profesor,Programación, 9 | 8,Profesor 8,2024-12-02,Profesor,Entornos, 10 | 9,Profesor 9,2024-12-02,Profesor,Programación, 11 | 10,Profesor 10,2024-12-02,Profesor,Entornos, 12 | 11,Alumno 1,2024-12-02,Alumno,,18 13 | 12,Alumno 2,2024-12-02,Alumno,,20 14 | 13,Alumno 3,2024-12-02,Alumno,,22 15 | 14,Alumno 4,2024-12-02,Alumno,,24 16 | 15,Alumno 5,2024-12-02,Alumno,,26 17 | 16,Alumno 6,2024-12-02,Alumno,,28 18 | 17,Alumno 7,2024-12-02,Alumno,,30 19 | 18,Alumno 8,2024-12-02,Alumno,,32 20 | 19,Alumno 9,2024-12-02,Alumno,,34 21 | 20,Alumno 10,2024-12-02,Alumno,,19 22 | 21,Alumno 11,2024-12-02,Alumno,,21 23 | 22,Alumno 12,2024-12-02,Alumno,,23 24 | 23,Alumno 13,2024-12-02,Alumno,,25 25 | 24,Alumno 14,2024-12-02,Alumno,,27 26 | 25,Alumno 15,2024-12-02,Alumno,,29 27 | 26,Alumno 16,2024-12-02,Alumno,,31 28 | 27,Alumno 17,2024-12-02,Alumno,,33 29 | 28,Alumno 18,2024-12-02,Alumno,,35 30 | 29,Alumno 19,2024-12-02,Alumno,,37 31 | 30,Alumno 20,2024-12-02,Alumno,,39 32 | 31,Alumno 21,2024-12-02,Alumno,,18 33 | 32,Alumno 22,2024-12-02,Alumno,,20 34 | 33,Alumno 23,2024-12-02,Alumno,,22 35 | 34,Alumno 24,2024-12-02,Alumno,,24 36 | 35,Alumno 25,2024-12-02,Alumno,,26 37 | 36,Alumno 26,2024-12-02,Alumno,,28 38 | 37,Alumno 27,2024-12-02,Alumno,,30 39 | 38,Alumno 28,2024-12-02,Alumno,,32 40 | 39,Alumno 29,2024-12-02,Alumno,,34 41 | 40,Alumno 30,2024-12-02,Alumno,,36 42 | -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/.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-Pokedex-JSON/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | kotlin("plugin.serialization") version "1.9.22" 4 | } 5 | 6 | group = "dev.joseluisgs" 7 | version = "1.0-SNAPSHOT" 8 | 9 | repositories { 10 | mavenCentral() 11 | } 12 | 13 | dependencies { 14 | implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") 15 | testImplementation("org.jetbrains.kotlin:kotlin-test") 16 | } 17 | 18 | tasks.test { 19 | useJUnitPlatform() 20 | } 21 | kotlin { 22 | jvmToolchain(21) 23 | } -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/07-Pokedex-JSON/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Feb 15 16:33:24 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Pokedex-Json" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/src/main/kotlin/import/NextEvolution.kt: -------------------------------------------------------------------------------- 1 | package import 2 | 3 | 4 | import kotlinx.serialization.SerialName 5 | import kotlinx.serialization.Serializable 6 | 7 | @Serializable 8 | data class NextEvolution( 9 | @SerialName("name") 10 | val name: String, 11 | @SerialName("num") 12 | val num: String 13 | ) -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/src/main/kotlin/import/PokedexDto.kt: -------------------------------------------------------------------------------- 1 | package import 2 | 3 | 4 | import kotlinx.serialization.SerialName 5 | import kotlinx.serialization.Serializable 6 | 7 | @Serializable 8 | data class PokedexDto( 9 | @SerialName("pokemon") 10 | val pokemonDto: List 11 | ) -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/src/main/kotlin/import/PokemonDto.kt: -------------------------------------------------------------------------------- 1 | package import 2 | 3 | 4 | import dev.joseluisgs.models.Pokemon 5 | import kotlinx.serialization.SerialName 6 | import kotlinx.serialization.Serializable 7 | 8 | @Serializable 9 | data class PokemonDto( 10 | @SerialName("avg_spawns") 11 | val avgSpawns: Double, 12 | @SerialName("candy") 13 | val candy: String, 14 | @SerialName("candy_count") 15 | val candyCount: Int? = null, 16 | @SerialName("egg") 17 | val egg: String, 18 | @SerialName("height") 19 | val height: String, 20 | @SerialName("id") 21 | val id: Int, 22 | @SerialName("img") 23 | val img: String, 24 | @SerialName("multipliers") 25 | val multipliers: List? = null, 26 | @SerialName("name") 27 | val name: String, 28 | @SerialName("next_evolution") 29 | val nextEvolution: List? = null, 30 | @SerialName("num") 31 | val num: String, 32 | @SerialName("prev_evolution") 33 | val prevEvolution: List? = null, 34 | @SerialName("spawn_chance") 35 | val spawnChance: Double, 36 | @SerialName("spawn_time") 37 | val spawnTime: String, 38 | @SerialName("type") 39 | val type: List, 40 | @SerialName("weaknesses") 41 | val weaknesses: List, 42 | @SerialName("weight") 43 | val weight: String 44 | ) 45 | 46 | fun PokemonDto.toPokemon(): Pokemon = Pokemon( 47 | avgSpawns = this.avgSpawns, 48 | candy = this.candy, 49 | candyCount = this.candyCount ?: 0, 50 | egg = if (this.egg == "Not in Eggs" || this.egg == "Omanyte Candy") 0 else this.egg.substringBefore("km").trim() 51 | .toInt(), 52 | height = this.height.substringBefore("m").trim().toDouble(), 53 | id = this.id, 54 | img = this.img, 55 | multipliers = this.multipliers, 56 | name = this.name, 57 | nextEvolution = this.nextEvolution, 58 | num = this.num, 59 | prevEvolution = this.prevEvolution, 60 | spawnChance = this.spawnChance, 61 | spawnTime = this.spawnTime, 62 | type = this.type, 63 | weaknesses = this.weaknesses, 64 | weight = this.weight.substringBefore("kg").trim().toDouble() 65 | ) -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/src/main/kotlin/import/PrevEvolution.kt: -------------------------------------------------------------------------------- 1 | package import 2 | 3 | 4 | import kotlinx.serialization.SerialName 5 | import kotlinx.serialization.Serializable 6 | 7 | @Serializable 8 | data class PrevEvolution( 9 | @SerialName("name") 10 | val name: String, 11 | @SerialName("num") 12 | val num: String 13 | ) -------------------------------------------------------------------------------- /Soluciones/07-Pokedex-JSON/src/main/kotlin/models/Pokemon.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | 4 | import import.NextEvolution 5 | import import.PrevEvolution 6 | import kotlinx.serialization.SerialName 7 | 8 | data class Pokemon( 9 | val avgSpawns: Double, 10 | val candy: String, 11 | val candyCount: Int, 12 | val egg: Int, 13 | val height: Double, 14 | val id: Int, 15 | val img: String, 16 | val multipliers: List? = null, 17 | val name: String, 18 | val nextEvolution: List? = null, 19 | val num: String, 20 | val prevEvolution: List? = null, 21 | @SerialName("spawn_chance") 22 | val spawnChance: Double, 23 | @SerialName("spawn_time") 24 | val spawnTime: String, 25 | @SerialName("type") 26 | val type: List, 27 | @SerialName("weaknesses") 28 | val weaknesses: List, 29 | @SerialName("weight") 30 | val weight: Double 31 | ) -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/.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-Barcos-FileService/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // Variables del properties 2 | val logging_version: String by project 3 | val logback_version: String by project 4 | val kotlin_serialization_version: String by project 5 | val mockk_Version: String by project 6 | 7 | plugins { 8 | kotlin("jvm") version "1.9.22" 9 | kotlin("plugin.serialization") version "1.9.22" 10 | } 11 | 12 | 13 | 14 | group = "dev.joseluisgs" 15 | version = "1.0-SNAPSHOT" 16 | 17 | repositories { 18 | mavenCentral() 19 | } 20 | 21 | dependencies { 22 | // log 23 | implementation("org.lighthousegames:logging:$logging_version") 24 | implementation("ch.qos.logback:logback-classic:$logback_version") 25 | implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlin_serialization_version") 26 | 27 | // Test 28 | testImplementation("org.jetbrains.kotlin:kotlin-test") 29 | testImplementation("io.mockk:mockk:$mockk_Version") 30 | } 31 | 32 | tasks.test { 33 | useJUnitPlatform() 34 | } 35 | kotlin { 36 | jvmToolchain(21) 37 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/data/barcos-back.csv: -------------------------------------------------------------------------------- 1 | Matricula,Nombre,Patron,Carga,Fecha,Tipo,Capacidad,Experiencia,Activo 2 | ATN-001,El Veloz,Gustavo Diaz,5000.0,2020-03-15,Atunero,15000.0,, 3 | ATN-002,La Rapida,Marisol Quevedo,4500.0,2019-07-21,Atunero,16000.0,, 4 | MAR-001,Concha Fina,Adrian Gomez,0.0,2018-05-18,Marisquero,,4, 5 | MAR-002,Estrella Marina,Lia Ramirez,2000.0,2021-12-01,Marisquero,,6, 6 | MTN-001,Titan de los Mares,Sergio Soto,0.0,2022-01-30,Mantenimiento,,,true 7 | MTN-002,Sol Naciente,Beatriz Molina,0.0,2021-04-25,Mantenimiento,,,false 8 | ATN-003,Horizonte,Francisco Lomas,3500.0,2020-09-05,Atunero,14000.0,, 9 | MAR-003,Poseidon,Jorge Paz,1750.0,2023-01-22,Marisquero,,5, 10 | MTN-003,Oceano Tranquilo,Eduardo Nunez,0.0,2022-07-08,Mantenimiento,,,true 11 | ATN-004,Rayo del Mar,Carmen Rios,2500.0,2018-11-03,Atunero,13500.0,, 12 | MAR-004,Brisa Marina,Lucas Herrero,750.0,2019-06-19,Marisquero,,7, 13 | MTN-004,Viento del Oeste,Natalia Ortiz,0.0,2021-12-21,Mantenimiento,,,false 14 | ATN-005,Triton,Victor Salas,6000.0,2020-02-27,Atunero,15500.0,, 15 | MAR-005,Arena Dorada,Luisa Jimenez,500.0,2020-07-13,Marisquero,,8, 16 | MTN-005,Espuma de Mar,Daniel Torres,0.0,2023-03-05,Mantenimiento,,,true 17 | ATN-006,Perla Negra,Julia Contreras,0.0,2021-05-26,Atunero,16500.0,, 18 | MAR-006,Caracola del Sur,Emilio Navarro,250.0,2022-09-30,Marisquero,,9, 19 | MTN-006,Guardian del Puerto,Jorge Castillo,0.0,2020-12-19,Mantenimiento,,,false 20 | ATN-007,Oceano Profundo,Adriana Moya,4200.0,2018-08-14,Atunero,17000.0,, 21 | MTN-007,Refugio Seguro,Patricia Soler,0.0,2020-10-03,Mantenimiento,,,true 22 | MAR-007,Sirena Cantarina,Roberto Alvarez,1750.0,2021-04-07,Marisquero,,12, 23 | -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/data/barcos.csv: -------------------------------------------------------------------------------- 1 | Matricula,Nombre,Patron,Carga,Fecha,Tipo,Capacidad,Experiencia,Activo 2 | ATN-001,El Veloz,Gustavo Diaz,5000,2020-03-15,Atunero,15000,, 3 | ATN-002,La Rapida,Marisol Quevedo,4500,2019-07-21,Atunero,16000,, 4 | MAR-001,Concha Fina,Adrian Gomez,0,2018-05-18,Marisquero,,4, 5 | MAR-002,Estrella Marina,Lia Ramirez,2000,2021-12-01,Marisquero,,6, 6 | MTN-001,Titan de los Mares,Sergio Soto,0,2022-01-30,Mantenimiento,,,TRUE 7 | MTN-002,Sol Naciente,Beatriz Molina,0,2021-04-25,Mantenimiento,,,FALSE 8 | ATN-003,Horizonte,Francisco Lomas,3500,2020-09-05,Atunero,14000,, 9 | MAR-003,Poseidon,Jorge Paz,1750,2023-01-22,Marisquero,,5, 10 | MTN-003,Oceano Tranquilo,Eduardo Nunez,0,2022-07-08,Mantenimiento,,,TRUE 11 | ATN-004,Rayo del Mar,Carmen Rios,2500,2018-11-03,Atunero,13500,, 12 | MAR-004,Brisa Marina,Lucas Herrero,750,2019-06-19,Marisquero,,7, 13 | MTN-004,Viento del Oeste,Natalia Ortiz,0,2021-12-21,Mantenimiento,,,FALSE 14 | ATN-005,Triton,Victor Salas,6000,2020-02-27,Atunero,15500,, 15 | MAR-005,Arena Dorada,Luisa Jimenez,500,2020-07-13,Marisquero,,8, 16 | MTN-005,Espuma de Mar,Daniel Torres,0,2023-03-05,Mantenimiento,,,TRUE 17 | ATN-006,Perla Negra,Julia Contreras,0,2021-05-26,Atunero,16500,, 18 | MAR-006,Caracola del Sur,Emilio Navarro,250,2022-09-30,Marisquero,,9, 19 | MTN-006,Guardian del Puerto,Jorge Castillo,0,2020-12-19,Mantenimiento,,,FALSE 20 | ATN-007,Oceano Profundo,Adriana Moya,4200,2018-08-14,Atunero,17000,, 21 | MTN-007,Refugio Seguro,Patricia Soler,0,2020-10-03,Mantenimiento,,,TRUE 22 | MAR-007,Sirena Cantarina,Roberto Alvarez,1750,2021-04-07,Marisquero,,12, -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | logging_version=1.3.0 3 | logback_version=1.5.0 4 | kotlin_serialization_version=1.6.0 5 | mockk_Version=1.13.9 6 | -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/08-Barcos-FileService/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Feb 19 15:29:04 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Barcos" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/Main.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs 2 | 3 | import dev.joseluisgs.dev.joseluisgs.validator.barco.BarcosValidator 4 | import dev.joseluisgs.models.barco.Barco 5 | import dev.joseluisgs.repositories.barcos.BarcosRepositoryImpl 6 | import dev.joseluisgs.repositories.cache.CacheImpl 7 | import dev.joseluisgs.services.barcos.BarcosService 8 | import dev.joseluisgs.services.barcos.BarcosServiceImpl 9 | import dev.joseluisgs.services.storage.barco.BarcosFileStorageJson 10 | import dev.joseluisgs.services.storage.barcos.BarcosFileStorageCsv 11 | 12 | fun main() { 13 | val service: BarcosService = BarcosServiceImpl( 14 | repository = BarcosRepositoryImpl( 15 | fileStorage = BarcosFileStorageJson() 16 | ), 17 | storage = BarcosFileStorageCsv(), 18 | cache = CacheImpl(), 19 | validator = BarcosValidator() 20 | ) 21 | 22 | service.getAll().forEach { println(it) } 23 | 24 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/dto/barco/BarcoDto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.dto.barco 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class BarcoDto( 7 | val matricula: String, 8 | val nombre: String, 9 | val patron: String, 10 | val cargaActual: String, 11 | val fechaIncorporacion: String, 12 | val tipo: String, 13 | val capacidad: String?, 14 | val experiencia: String?, 15 | val activo: String? 16 | ) -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/exceptions/barco/BarcoExceptions.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.exceptions.barco 2 | 3 | sealed class BarcoExceptions(message: String) : Exception(message) { 4 | class TypeNotFound(message: String) : BarcoExceptions("El tipo de barco: $message no es válido") 5 | class BarcoNotValid(message: String) : BarcoExceptions("El barco no es válido: $message") 6 | class BarcoNotFound(message: String) : BarcoExceptions("No se encontró el barco: $message") 7 | class BarcoAlreadyExists(message: String) : BarcoExceptions("El barco ya existe: $message") 8 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/exceptions/storage/StorageExceptions.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.exceptions.storage 2 | 3 | sealed class StorageExceptions(message: String) : Exception(message) { 4 | class FileNotFound(message: String) : StorageExceptions(message) 5 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/models/barco/Atunero.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | import java.time.LocalDate 4 | 5 | class Atunero( 6 | matricula: String, 7 | nombre: String, 8 | patron: String, 9 | cargaActual: Double, 10 | fechaIncorporacion: LocalDate, 11 | val cargaMaxima: Double 12 | ) : Barco(matricula, nombre, patron, cargaActual, fechaIncorporacion), PescarConCaña { 13 | 14 | override fun pescarConCaña() { 15 | println("Atunero pescando con caña") 16 | } 17 | 18 | override fun toString(): String { 19 | return "Atunero(matricula='$matricula', nombre='$nombre', patron='$patron', cargaActual=$cargaActual, fechaIncorporacion=$fechaIncorporacion, cargaMaxima=$cargaMaxima)" 20 | } 21 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/models/barco/Barco.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | import java.time.LocalDate 4 | 5 | abstract class Barco( 6 | val matricula: String, 7 | val nombre: String, 8 | val patron: String, 9 | val cargaActual: Double, 10 | val fechaIncorporacion: LocalDate 11 | ) -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/models/barco/Mantenimiento.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | import java.time.LocalDate 4 | 5 | class Mantenimiento( 6 | matricula: String, 7 | nombre: String, 8 | patron: String, 9 | cargaActual: Double, 10 | fechaIncorporacion: LocalDate, 11 | val activo: Boolean 12 | ) : Barco(matricula, nombre, patron, cargaActual, fechaIncorporacion) { 13 | 14 | fun reparar(barco: Barco) { 15 | println("Mantenimeinto reparando un barco") 16 | } 17 | 18 | override fun toString(): String { 19 | return "Mantenimiento(matricula='$matricula', nombre='$nombre', patron='$patron', cargaActual=$cargaActual, fechaIncorporacion=$fechaIncorporacion, activo=$activo)" 20 | } 21 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/models/barco/Marisquero.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | import java.time.LocalDate 4 | 5 | class Marisquero( 6 | matricula: String, 7 | nombre: String, 8 | patron: String, 9 | cargaActual: Double, 10 | fechaIncorporacion: LocalDate, 11 | val experienciaTripulacion: Int 12 | ) : Barco(matricula, nombre, patron, cargaActual, fechaIncorporacion), PescarConCaña, PescarConRed { 13 | 14 | override fun pescarConCaña() { 15 | println("Marisquero pescando con caña") 16 | } 17 | 18 | override fun pescarConRed() { 19 | println("Marisquero pescando con red") 20 | } 21 | 22 | override fun toString(): String { 23 | return "Marisquero(matricula='$matricula', nombre='$nombre', patron='$patron', cargaActual=$cargaActual, fechaIncorporacion=$fechaIncorporacion, experienciaTripulacion=$experienciaTripulacion)" 24 | } 25 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/models/barco/PescarConCaña.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | interface PescarConCaña { 4 | fun pescarConCaña() 5 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/models/barco/PescarConRed.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | interface PescarConRed { 4 | fun pescarConRed() 5 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/repositories/barco/BarcosRepository.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.repositories.barcos 2 | 3 | import dev.joseluisgs.models.barco.Barco 4 | import dev.joseluisgs.repositories.crud.CrudRepository 5 | 6 | interface BarcosRepository : CrudRepository { 7 | fun getByName(name: String): List 8 | fun getByPatron(patron: String): List 9 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/repositories/cache/Cache.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.repositories.cache 2 | 3 | interface Cache { 4 | fun get(key: KEY): T? 5 | fun put(key: KEY, value: T) 6 | fun remove(key: KEY) 7 | fun clear() 8 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/repositories/cache/CacheImpl.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.repositories.cache 2 | 3 | import org.lighthousegames.logging.logging 4 | 5 | private val logger = logging() 6 | 7 | class CacheImpl( 8 | val size: Int = 5 9 | ) : Cache { 10 | 11 | private val cache = mutableMapOf() 12 | 13 | override fun get(key: KEY): T? { 14 | logger.info { "Obteniendo valor de la cache por clave: $key" } 15 | return cache[key] 16 | } 17 | 18 | override fun put(key: KEY, value: T) { 19 | logger.info { "Guardando valor en la cache por clave $key" } 20 | if (cache.size >= size && !cache.containsKey(key)) { 21 | val firstKey = cache.keys.first() 22 | logger.info { "Eliminando valor de la cache por clave $firstKey" } 23 | cache.remove(firstKey) 24 | } 25 | cache[key] = value 26 | 27 | } 28 | 29 | override fun remove(key: KEY) { 30 | logger.info { "Eliminando valor de la cache por clave $key" } 31 | cache.remove(key) 32 | } 33 | 34 | override fun clear() { 35 | logger.info { "Limpiando la cache" } 36 | cache.clear() 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/repositories/crud/CrudRepository.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.repositories.crud 2 | 3 | interface CrudRepository { 4 | fun getAll(): List 5 | fun getById(id: ID): T? 6 | fun save(value: T): T 7 | fun update(id: ID, value: T): T? 8 | fun delete(id: ID): T? 9 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/services/barco/BarcosService.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services.barcos 2 | 3 | import dev.joseluisgs.models.barco.Barco 4 | import java.io.File 5 | 6 | interface BarcosService { 7 | fun getAll(page: Int? = null, size: Int? = null): List 8 | fun getByName(name: String): List 9 | fun getByPatron(patron: String): List 10 | fun getByMatricula(matricula: String): Barco 11 | fun save(barco: Barco): Barco 12 | fun update(barco: Barco): Barco 13 | fun delete(matricula: String): Barco 14 | fun exportToFile(file: File) 15 | fun importFromFile(file: File) 16 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/services/storage/barco/BarcosFileStorageCsv.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services.storage.barcos 2 | 3 | import dev.joseluisgs.dto.barco.BarcoDto 4 | import dev.joseluisgs.exceptions.barco.BarcoExceptions 5 | import dev.joseluisgs.exceptions.storage.StorageExceptions 6 | import dev.joseluisgs.mappers.barco.toBarco 7 | import dev.joseluisgs.models.barco.Atunero 8 | import dev.joseluisgs.models.barco.Barco 9 | import dev.joseluisgs.models.barco.Mantenimiento 10 | import dev.joseluisgs.models.barco.Marisquero 11 | import dev.joseluisgs.services.storage.base.FileStorage 12 | import org.lighthousegames.logging.logging 13 | import java.io.File 14 | 15 | private val logger = logging() 16 | 17 | class BarcosFileStorageCsv : FileStorage { 18 | override fun readFromFile(file: File): List { 19 | logger.info { "Leyendo de fichero CSV: $file" } 20 | if (!file.exists()) { 21 | logger.error { "El fichero no existe: $file" } 22 | throw StorageExceptions.FileNotFound("El fichero no existe: $file") 23 | } 24 | 25 | return file.readLines() 26 | .drop(1) 27 | .map { 28 | it.split(",") 29 | }.map { 30 | BarcoDto( 31 | matricula = it[0], 32 | nombre = it[1], 33 | patron = it[2], 34 | cargaActual = it[3], 35 | fechaIncorporacion = it[4], 36 | tipo = it[5], 37 | capacidad = it[6], 38 | experiencia = it[7], 39 | activo = it[8] 40 | ).toBarco() 41 | } 42 | } 43 | 44 | 45 | override fun writeToFile(list: List, file: File) { 46 | logger.info { "Escribiendo en fichero CSV: $file" } 47 | file.writeText("Matricula,Nombre,Patron,Carga,Fecha,Tipo,Capacidad,Experiencia,Activo\n") 48 | list.forEach { 49 | file.appendText("${it.matricula},${it.nombre},${it.patron},${it.cargaActual},${it.fechaIncorporacion},") 50 | when (it) { 51 | is Atunero -> { 52 | file.appendText("${"Atunero"},${it.cargaMaxima},,") 53 | } 54 | 55 | is Marisquero -> { 56 | file.appendText("${"Marisquero"},,${it.experienciaTripulacion},") 57 | } 58 | 59 | is Mantenimiento -> { 60 | file.appendText("${"Mantenimiento"},,,${it.activo}") 61 | } 62 | 63 | else -> throw BarcoExceptions.TypeNotFound(it::class.simpleName ?: "Barco") 64 | } 65 | file.appendText("\n") 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/services/storage/barco/BarcosFileStorageJson.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services.storage.barco 2 | 3 | import dev.joseluisgs.dto.barco.BarcoDto 4 | import dev.joseluisgs.exceptions.storage.StorageExceptions 5 | import dev.joseluisgs.mappers.barco.toBarco 6 | import dev.joseluisgs.mappers.barco.toBarcoDto 7 | import dev.joseluisgs.models.barco.Barco 8 | import dev.joseluisgs.services.storage.base.FileStorage 9 | import kotlinx.serialization.encodeToString 10 | import kotlinx.serialization.json.Json 11 | import org.lighthousegames.logging.logging 12 | import java.io.File 13 | 14 | private val logger = logging() 15 | 16 | class BarcosFileStorageJson : FileStorage { 17 | override fun readFromFile(file: File): List { 18 | logger.info { "Leyendo de fichero JSON: $file" } 19 | if (!file.exists()) { 20 | logger.error { "El fichero no existe: $file" } 21 | throw StorageExceptions.FileNotFound("El fichero no existe: $file") 22 | } 23 | 24 | return Json { ignoreUnknownKeys = true } 25 | .decodeFromString>(file.readText()) 26 | .map { 27 | it.toBarco() 28 | } 29 | } 30 | 31 | override fun writeToFile(list: List, file: File) { 32 | logger.info { "Escribiendo en fichero JSON: $file" } 33 | file.writeText( 34 | Json { 35 | ignoreUnknownKeys = true 36 | prettyPrint = true 37 | }.encodeToString>( 38 | list.map { it.toBarcoDto() } 39 | ) 40 | ) 41 | } 42 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/main/kotlin/services/storage/base/FileStorage.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services.storage.base 2 | 3 | import java.io.File 4 | 5 | interface FileStorage { 6 | fun readFromFile(file: File): List 7 | fun writeToFile(list: List, file: File) 8 | } -------------------------------------------------------------------------------- /Soluciones/08-Barcos-FileService/src/test/kotlin/services/barco/BarcosServiceImplTest.kt: -------------------------------------------------------------------------------- 1 | package services.barco 2 | 3 | import dev.joseluisgs.dev.joseluisgs.validator.barco.BarcosValidator 4 | import dev.joseluisgs.models.barco.Atunero 5 | import dev.joseluisgs.models.barco.Barco 6 | import dev.joseluisgs.repositories.barcos.BarcosRepository 7 | import dev.joseluisgs.repositories.cache.Cache 8 | import dev.joseluisgs.services.barcos.BarcosServiceImpl 9 | import dev.joseluisgs.services.storage.base.FileStorage 10 | import io.mockk.every 11 | import io.mockk.impl.annotations.InjectMockKs 12 | import io.mockk.impl.annotations.MockK 13 | import io.mockk.junit5.MockKExtension 14 | import io.mockk.verify 15 | import org.junit.jupiter.api.Assertions.assertEquals 16 | import org.junit.jupiter.api.Test 17 | import org.junit.jupiter.api.extension.ExtendWith 18 | import java.time.LocalDate 19 | 20 | @ExtendWith(MockKExtension::class) 21 | class BarcosServiceImplTest { 22 | // Mocks 23 | @MockK 24 | private lateinit var repository: BarcosRepository 25 | 26 | @MockK 27 | private lateinit var storage: FileStorage 28 | 29 | @MockK 30 | private lateinit var cache: Cache 31 | 32 | @MockK 33 | private lateinit var validator: BarcosValidator 34 | 35 | // system under test 36 | @InjectMockKs 37 | private lateinit var service: BarcosServiceImpl 38 | 39 | 40 | @Test 41 | fun `getAll returns all barcos`() { 42 | // Arrange 43 | val expectedBarcos = listOf( 44 | Atunero( 45 | "123456789", 46 | "Barco 1", 47 | "Pepe", 48 | 100.0, 49 | LocalDate.now(), 50 | 1000.0, 51 | ) 52 | ) 53 | 54 | // Actuamos como mock 55 | every { repository.getAll() } returns expectedBarcos 56 | 57 | // Ejecutamos el método 58 | val actualBarcos = service.getAll(null, null) 59 | 60 | // Assert 61 | assertEquals(expectedBarcos, actualBarcos) 62 | 63 | // Verificamos que se ha llamado al método 64 | verify(exactly = 1) { repository.getAll() } 65 | } 66 | 67 | @Test 68 | fun getByName() { 69 | } 70 | 71 | @Test 72 | fun getByPatron() { 73 | } 74 | 75 | @Test 76 | fun getByMatricula() { 77 | } 78 | 79 | @Test 80 | fun save() { 81 | } 82 | 83 | @Test 84 | fun update() { 85 | } 86 | 87 | @Test 88 | fun delete() { 89 | } 90 | 91 | @Test 92 | fun exportToFile() { 93 | } 94 | 95 | @Test 96 | fun importFromFile() { 97 | } 98 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/.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-Barcos-FileService-Config-Backup/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/backup/barcos.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/09-Barcos-FileService-Config-Backup/backup/barcos.zip -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // Variables del properties 2 | val logging_version: String by project 3 | val logback_version: String by project 4 | val kotlin_serialization_version: String by project 5 | val mockk_Version: String by project 6 | 7 | plugins { 8 | kotlin("jvm") version "1.9.22" 9 | kotlin("plugin.serialization") version "1.9.22" 10 | } 11 | 12 | 13 | 14 | group = "dev.joseluisgs" 15 | version = "1.0-SNAPSHOT" 16 | 17 | repositories { 18 | mavenCentral() 19 | } 20 | 21 | dependencies { 22 | // log 23 | implementation("org.lighthousegames:logging:$logging_version") 24 | implementation("ch.qos.logback:logback-classic:$logback_version") 25 | implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlin_serialization_version") 26 | 27 | // Test 28 | testImplementation("org.jetbrains.kotlin:kotlin-test") 29 | testImplementation("io.mockk:mockk:$mockk_Version") 30 | } 31 | 32 | tasks.test { 33 | useJUnitPlatform() 34 | } 35 | kotlin { 36 | jvmToolchain(21) 37 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/data/barcos-back.csv: -------------------------------------------------------------------------------- 1 | Matricula,Nombre,Patron,Carga,Fecha,Tipo,Capacidad,Experiencia,Activo 2 | ATN-001,El Veloz,Gustavo Diaz,5000.0,2020-03-15,Atunero,15000.0,, 3 | ATN-002,La Rapida,Marisol Quevedo,4500.0,2019-07-21,Atunero,16000.0,, 4 | MAR-001,Concha Fina,Adrian Gomez,0.0,2018-05-18,Marisquero,,4, 5 | MAR-002,Estrella Marina,Lia Ramirez,2000.0,2021-12-01,Marisquero,,6, 6 | MTN-001,Titan de los Mares,Sergio Soto,0.0,2022-01-30,Mantenimiento,,,true 7 | MTN-002,Sol Naciente,Beatriz Molina,0.0,2021-04-25,Mantenimiento,,,false 8 | ATN-003,Horizonte,Francisco Lomas,3500.0,2020-09-05,Atunero,14000.0,, 9 | MAR-003,Poseidon,Jorge Paz,1750.0,2023-01-22,Marisquero,,5, 10 | MTN-003,Oceano Tranquilo,Eduardo Nunez,0.0,2022-07-08,Mantenimiento,,,true 11 | ATN-004,Rayo del Mar,Carmen Rios,2500.0,2018-11-03,Atunero,13500.0,, 12 | MAR-004,Brisa Marina,Lucas Herrero,750.0,2019-06-19,Marisquero,,7, 13 | MTN-004,Viento del Oeste,Natalia Ortiz,0.0,2021-12-21,Mantenimiento,,,false 14 | ATN-005,Triton,Victor Salas,6000.0,2020-02-27,Atunero,15500.0,, 15 | MAR-005,Arena Dorada,Luisa Jimenez,500.0,2020-07-13,Marisquero,,8, 16 | MTN-005,Espuma de Mar,Daniel Torres,0.0,2023-03-05,Mantenimiento,,,true 17 | ATN-006,Perla Negra,Julia Contreras,0.0,2021-05-26,Atunero,16500.0,, 18 | MAR-006,Caracola del Sur,Emilio Navarro,250.0,2022-09-30,Marisquero,,9, 19 | MTN-006,Guardian del Puerto,Jorge Castillo,0.0,2020-12-19,Mantenimiento,,,false 20 | ATN-007,Oceano Profundo,Adriana Moya,4200.0,2018-08-14,Atunero,17000.0,, 21 | MTN-007,Refugio Seguro,Patricia Soler,0.0,2020-10-03,Mantenimiento,,,true 22 | MAR-007,Sirena Cantarina,Roberto Alvarez,1750.0,2021-04-07,Marisquero,,12, 23 | -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/data/barcos.csv: -------------------------------------------------------------------------------- 1 | Matricula,Nombre,Patron,Carga,Fecha,Tipo,Capacidad,Experiencia,Activo 2 | ATN-001,El Veloz,Gustavo Diaz,5000,2020-03-15,Atunero,15000,, 3 | ATN-002,La Rapida,Marisol Quevedo,4500,2019-07-21,Atunero,16000,, 4 | MAR-001,Concha Fina,Adrian Gomez,0,2018-05-18,Marisquero,,4, 5 | MAR-002,Estrella Marina,Lia Ramirez,2000,2021-12-01,Marisquero,,6, 6 | MTN-001,Titan de los Mares,Sergio Soto,0,2022-01-30,Mantenimiento,,,TRUE 7 | MTN-002,Sol Naciente,Beatriz Molina,0,2021-04-25,Mantenimiento,,,FALSE 8 | ATN-003,Horizonte,Francisco Lomas,3500,2020-09-05,Atunero,14000,, 9 | MAR-003,Poseidon,Jorge Paz,1750,2023-01-22,Marisquero,,5, 10 | MTN-003,Oceano Tranquilo,Eduardo Nunez,0,2022-07-08,Mantenimiento,,,TRUE 11 | ATN-004,Rayo del Mar,Carmen Rios,2500,2018-11-03,Atunero,13500,, 12 | MAR-004,Brisa Marina,Lucas Herrero,750,2019-06-19,Marisquero,,7, 13 | MTN-004,Viento del Oeste,Natalia Ortiz,0,2021-12-21,Mantenimiento,,,FALSE 14 | ATN-005,Triton,Victor Salas,6000,2020-02-27,Atunero,15500,, 15 | MAR-005,Arena Dorada,Luisa Jimenez,500,2020-07-13,Marisquero,,8, 16 | MTN-005,Espuma de Mar,Daniel Torres,0,2023-03-05,Mantenimiento,,,TRUE 17 | ATN-006,Perla Negra,Julia Contreras,0,2021-05-26,Atunero,16500,, 18 | MAR-006,Caracola del Sur,Emilio Navarro,250,2022-09-30,Marisquero,,9, 19 | MTN-006,Guardian del Puerto,Jorge Castillo,0,2020-12-19,Mantenimiento,,,FALSE 20 | ATN-007,Oceano Profundo,Adriana Moya,4200,2018-08-14,Atunero,17000,, 21 | MTN-007,Refugio Seguro,Patricia Soler,0,2020-10-03,Mantenimiento,,,TRUE 22 | MAR-007,Sirena Cantarina,Roberto Alvarez,1750,2021-04-07,Marisquero,,12, -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | logging_version=1.3.0 3 | logback_version=1.5.0 4 | kotlin_serialization_version=1.6.0 5 | mockk_Version=1.13.9 6 | -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/09-Barcos-FileService-Config-Backup/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Feb 19 15:29:04 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Barcos" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/config/Config.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.config 2 | 3 | import org.lighthousegames.logging.logging 4 | import java.util.* 5 | 6 | private val logger = logging() 7 | 8 | object Config { 9 | var storageDir: String = "data" 10 | private set 11 | var storageFile: String = "barcos.json" 12 | private set 13 | var cacheSize: Int = 5 14 | private set 15 | var storageBackupDir: String = "backup" 16 | private set 17 | var storageBackupFile: String = "barcos.zip" 18 | private set 19 | 20 | init { 21 | val properties = Properties() 22 | properties.load(ClassLoader.getSystemResourceAsStream("config.properties")) 23 | logger.debug { "Cargando configuración" } 24 | storageDir = properties.getOrDefault("storage.dir", storageDir).toString() 25 | storageFile = properties.getProperty("storage.file", storageFile) 26 | cacheSize = properties.getProperty("cache.size", cacheSize.toString()).toInt() 27 | storageBackupDir = properties.getProperty("storage.backup.dir", storageBackupDir) 28 | storageBackupFile = properties.getProperty("storage.backup.file", storageBackupFile) 29 | } 30 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/dto/barco/BarcoDto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.dto.barco 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class BarcoDto( 7 | val matricula: String, 8 | val nombre: String, 9 | val patron: String, 10 | val cargaActual: String, 11 | val fechaIncorporacion: String, 12 | val tipo: String, 13 | val capacidad: String?, 14 | val experiencia: String?, 15 | val activo: String? 16 | ) -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/exceptions/barco/BarcoExceptions.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.exceptions.barco 2 | 3 | sealed class BarcoExceptions(message: String) : Exception(message) { 4 | class TypeNotFound(message: String) : BarcoExceptions("El tipo de barco: $message no es válido") 5 | class BarcoNotValid(message: String) : BarcoExceptions("El barco no es válido: $message") 6 | class BarcoNotFound(message: String) : BarcoExceptions("No se encontró el barco: $message") 7 | class BarcoAlreadyExists(message: String) : BarcoExceptions("El barco ya existe: $message") 8 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/exceptions/storage/StorageExceptions.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.exceptions.storage 2 | 3 | sealed class StorageExceptions(message: String) : Exception(message) { 4 | class FileNotFound(message: String) : StorageExceptions(message) 5 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/models/barco/Atunero.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | import java.time.LocalDate 4 | 5 | class Atunero( 6 | matricula: String, 7 | nombre: String, 8 | patron: String, 9 | cargaActual: Double, 10 | fechaIncorporacion: LocalDate, 11 | val cargaMaxima: Double 12 | ) : Barco(matricula, nombre, patron, cargaActual, fechaIncorporacion), PescarConCaña { 13 | 14 | override fun pescarConCaña() { 15 | println("Atunero pescando con caña") 16 | } 17 | 18 | override fun toString(): String { 19 | return "Atunero(matricula='$matricula', nombre='$nombre', patron='$patron', cargaActual=$cargaActual, fechaIncorporacion=$fechaIncorporacion, cargaMaxima=$cargaMaxima)" 20 | } 21 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/models/barco/Barco.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | import java.time.LocalDate 4 | 5 | abstract class Barco( 6 | val matricula: String, 7 | val nombre: String, 8 | val patron: String, 9 | val cargaActual: Double, 10 | val fechaIncorporacion: LocalDate 11 | ) -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/models/barco/Mantenimiento.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | import java.time.LocalDate 4 | 5 | class Mantenimiento( 6 | matricula: String, 7 | nombre: String, 8 | patron: String, 9 | cargaActual: Double, 10 | fechaIncorporacion: LocalDate, 11 | val activo: Boolean 12 | ) : Barco(matricula, nombre, patron, cargaActual, fechaIncorporacion) { 13 | 14 | fun reparar(barco: Barco) { 15 | println("Mantenimeinto reparando un barco") 16 | } 17 | 18 | override fun toString(): String { 19 | return "Mantenimiento(matricula='$matricula', nombre='$nombre', patron='$patron', cargaActual=$cargaActual, fechaIncorporacion=$fechaIncorporacion, activo=$activo)" 20 | } 21 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/models/barco/Marisquero.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | import java.time.LocalDate 4 | 5 | class Marisquero( 6 | matricula: String, 7 | nombre: String, 8 | patron: String, 9 | cargaActual: Double, 10 | fechaIncorporacion: LocalDate, 11 | val experienciaTripulacion: Int 12 | ) : Barco(matricula, nombre, patron, cargaActual, fechaIncorporacion), PescarConCaña, PescarConRed { 13 | 14 | override fun pescarConCaña() { 15 | println("Marisquero pescando con caña") 16 | } 17 | 18 | override fun pescarConRed() { 19 | println("Marisquero pescando con red") 20 | } 21 | 22 | override fun toString(): String { 23 | return "Marisquero(matricula='$matricula', nombre='$nombre', patron='$patron', cargaActual=$cargaActual, fechaIncorporacion=$fechaIncorporacion, experienciaTripulacion=$experienciaTripulacion)" 24 | } 25 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/models/barco/PescarConCaña.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | interface PescarConCaña { 4 | fun pescarConCaña() 5 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/models/barco/PescarConRed.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models.barco 2 | 3 | interface PescarConRed { 4 | fun pescarConRed() 5 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/repositories/barco/BarcosRepository.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.repositories.barcos 2 | 3 | import dev.joseluisgs.models.barco.Barco 4 | import dev.joseluisgs.repositories.crud.CrudRepository 5 | 6 | interface BarcosRepository : CrudRepository { 7 | fun getByName(name: String): List 8 | fun getByPatron(patron: String): List 9 | fun loadData() 10 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/repositories/cache/Cache.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.repositories.cache 2 | 3 | interface Cache { 4 | fun get(key: KEY): T? 5 | fun put(key: KEY, value: T) 6 | fun remove(key: KEY) 7 | fun clear() 8 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/repositories/cache/CacheImpl.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.repositories.cache 2 | 3 | import dev.joseluisgs.config.Config 4 | import org.lighthousegames.logging.logging 5 | 6 | private val logger = logging() 7 | 8 | class CacheImpl( 9 | val size: Int = Config.cacheSize 10 | ) : Cache { 11 | 12 | private val cache = mutableMapOf() 13 | 14 | override fun get(key: KEY): T? { 15 | logger.debug { "Obteniendo valor de la cache por clave: $key" } 16 | return cache[key] 17 | } 18 | 19 | override fun put(key: KEY, value: T) { 20 | logger.debug { "Guardando valor en la cache por clave $key" } 21 | if (cache.size >= size && !cache.containsKey(key)) { 22 | val firstKey = cache.keys.first() 23 | logger.debug { "Eliminando valor de la cache por clave $firstKey" } 24 | cache.remove(firstKey) 25 | } 26 | cache[key] = value 27 | 28 | } 29 | 30 | override fun remove(key: KEY) { 31 | logger.debug { "Eliminando valor de la cache por clave $key" } 32 | cache.remove(key) 33 | } 34 | 35 | override fun clear() { 36 | logger.debug { "Limpiando la cache" } 37 | cache.clear() 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/repositories/crud/CrudRepository.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.repositories.crud 2 | 3 | interface CrudRepository { 4 | fun getAll(): List 5 | fun getById(id: ID): T? 6 | fun save(value: T): T 7 | fun update(id: ID, value: T): T? 8 | fun delete(id: ID): T? 9 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/services/backup/Backup.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services.backup 2 | 3 | interface Backup { 4 | fun backup() 5 | fun restore() 6 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/services/barco/BarcosService.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services.barcos 2 | 3 | import dev.joseluisgs.models.barco.Barco 4 | import java.io.File 5 | 6 | interface BarcosService { 7 | fun getAll(page: Int? = null, size: Int? = null): List 8 | fun getByName(name: String): List 9 | fun getByPatron(patron: String): List 10 | fun getByMatricula(matricula: String): Barco 11 | fun save(barco: Barco): Barco 12 | fun update(barco: Barco): Barco 13 | fun delete(matricula: String): Barco 14 | fun exportToFile(file: File) 15 | fun importFromFile(file: File) 16 | fun backup() 17 | fun restore() 18 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/services/storage/barco/BarcosFileStorageJson.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services.storage.barco 2 | 3 | import dev.joseluisgs.dto.barco.BarcoDto 4 | import dev.joseluisgs.exceptions.storage.StorageExceptions 5 | import dev.joseluisgs.mappers.barco.toBarco 6 | import dev.joseluisgs.mappers.barco.toBarcoDto 7 | import dev.joseluisgs.models.barco.Barco 8 | import dev.joseluisgs.services.storage.base.FileStorage 9 | import kotlinx.serialization.encodeToString 10 | import kotlinx.serialization.json.Json 11 | import org.lighthousegames.logging.logging 12 | import java.io.File 13 | 14 | private val logger = logging() 15 | 16 | class BarcosFileStorageJson : FileStorage { 17 | override fun readFromFile(file: File): List { 18 | logger.debug { "Leyendo de fichero JSON: $file" } 19 | if (!file.exists()) { 20 | logger.error { "El fichero no existe: $file" } 21 | throw StorageExceptions.FileNotFound("El fichero no existe: $file") 22 | } 23 | 24 | return Json { ignoreUnknownKeys = true } 25 | .decodeFromString>(file.readText()) 26 | .map { 27 | it.toBarco() 28 | } 29 | } 30 | 31 | override fun writeToFile(list: List, file: File) { 32 | logger.debug { "Escribiendo en fichero JSON: $file" } 33 | file.writeText( 34 | Json { 35 | ignoreUnknownKeys = true 36 | prettyPrint = true 37 | }.encodeToString>( 38 | list.map { it.toBarcoDto() } 39 | ) 40 | ) 41 | } 42 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/kotlin/services/storage/base/FileStorage.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services.storage.base 2 | 3 | import java.io.File 4 | 5 | interface FileStorage { 6 | fun readFromFile(file: File): List 7 | fun writeToFile(list: List, file: File) 8 | } -------------------------------------------------------------------------------- /Soluciones/09-Barcos-FileService-Config-Backup/src/main/resources/config.properties: -------------------------------------------------------------------------------- 1 | storage.dir=data 2 | storage.file=barcos.json 3 | storage.backup.dir=backup 4 | storage.backup.file=barcos.zip 5 | cache.size=5 -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/.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/10-Ficheros-XML/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | kotlin("plugin.serialization") version "1.9.22" 4 | } 5 | 6 | group = "dev.joseluisgs" 7 | version = "1.0-SNAPSHOT" 8 | 9 | repositories { 10 | mavenCentral() 11 | } 12 | 13 | dependencies { 14 | // JSON 15 | implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") 16 | // XML 17 | implementation("io.github.pdvrieze.xmlutil:core-jvm:0.86.3") 18 | implementation("io.github.pdvrieze.xmlutil:serialization-jvm:0.86.3") 19 | 20 | testImplementation("org.jetbrains.kotlin:kotlin-test") 21 | } 22 | 23 | tasks.test { 24 | useJUnitPlatform() 25 | } 26 | kotlin { 27 | jvmToolchain(21) 28 | } -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/data/venta.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 1, 3 | "fecha": "2021-01-01", 4 | "cliente": { 5 | "nombre": "Pepe", 6 | "email": "pepe@pepe.com" 7 | }, 8 | "lineas": [ 9 | { 10 | "producto": { 11 | "nombre": "Laptop", 12 | "precio": 1000.0 13 | }, 14 | "cantidad": 1, 15 | "precio": 1000.0 16 | }, 17 | { 18 | "producto": { 19 | "nombre": "Ratón", 20 | "precio": 20.0 21 | }, 22 | "cantidad": 2, 23 | "precio": 20.0 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/data/venta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/10-Ficheros-XML/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 27 15:16:48 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Ficheros-XML" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/src/main/kotlin/Main.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs 2 | 3 | import dev.joseluisgs.models.Cliente 4 | import dev.joseluisgs.models.Producto 5 | import dev.joseluisgs.models.Venta 6 | import kotlinx.serialization.decodeFromString 7 | import kotlinx.serialization.encodeToString 8 | import kotlinx.serialization.json.Json 9 | import nl.adaptivity.xmlutil.serialization.XML 10 | import java.io.File 11 | import java.nio.file.Files 12 | import java.nio.file.Path 13 | 14 | fun main() { 15 | Files.createDirectories(Path.of("data")) 16 | 17 | // Crear un cliente 18 | val cliente = Cliente("Pepe", "pepe@pepe.com") 19 | val venta = Venta(1, "2021-01-01", cliente) 20 | venta.addLinea(Producto("Laptop", 1000.0), 1) 21 | venta.addLinea(Producto("Ratón", 20.0), 2) 22 | 23 | println(venta) 24 | 25 | val json = Json { prettyPrint = true; ignoreUnknownKeys = true } 26 | 27 | val fileWriteJson = File("data/venta.json") 28 | fileWriteJson.writeText(json.encodeToString(venta)) 29 | 30 | val fileReadJson = File("data/venta.json") 31 | val ventaFromJson = json.decodeFromString(fileReadJson.readText()) 32 | println(ventaFromJson) 33 | 34 | val xml = XML { indent = 4 } 35 | val fileWriteXml = File("data/venta.xml") 36 | fileWriteXml.writeText(xml.encodeToString(venta)) 37 | val fileReadXml = File("data/venta.xml") 38 | val ventaFromXml = xml.decodeFromString(fileReadXml.readText()) 39 | println(ventaFromXml) 40 | 41 | } -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/src/main/kotlin/models/Cliente.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class Cliente( 7 | val nombre: String, 8 | val email: String, 9 | ) -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/src/main/kotlin/models/Producto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class Producto( 7 | val nombre: String, 8 | val precio: Double, 9 | ) -------------------------------------------------------------------------------- /Soluciones/10-Ficheros-XML/src/main/kotlin/models/Venta.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class Venta( 7 | val id: Int, 8 | val fecha: String, 9 | val cliente: Cliente, 10 | ) { 11 | private val lineas = mutableListOf() 12 | val total 13 | get() = lineas.sumOf { it.precio * it.cantidad } 14 | 15 | fun addLinea(producto: Producto, cantidad: Int) { 16 | lineas.add(LineaVenta(producto, cantidad, producto.precio)) 17 | } 18 | 19 | fun removeLinea(producto: Producto) { 20 | lineas.removeIf { it.producto == producto } 21 | } 22 | 23 | override fun toString(): String { 24 | return "Venta(id=$id, fecha='$fecha', cliente=$cliente, lineas=$lineas, total=$total)" 25 | } 26 | 27 | 28 | @Serializable 29 | data class LineaVenta( 30 | val producto: Producto, 31 | val cantidad: Int, 32 | val precio: Double 33 | ) 34 | } -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/.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/11-AccidentesMadrid/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | } 4 | 5 | group = "dev.joseluisgs" 6 | version = "1.0-SNAPSHOT" 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | testImplementation("org.jetbrains.kotlin:kotlin-test") 14 | } 15 | 16 | tasks.test { 17 | useJUnitPlatform() 18 | } 19 | kotlin { 20 | jvmToolchain(21) 21 | } -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/11-AccidentesMadrid/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 27 15:46:37 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Accidentes" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/src/main/kotlin/dev/joseluisgs/models/Accidente.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.dev.joseluisgs.models 2 | 3 | import java.time.LocalDate 4 | import java.time.LocalTime 5 | 6 | data class Accidente( 7 | val numExpediente: String, 8 | val fecha: LocalDate, 9 | val hora: LocalTime, 10 | val calle: String, 11 | val distrito: String, 12 | val tipoAccidente: String, 13 | val estadoMeteorologico: String, 14 | val tipoVehiculo: String, 15 | val tipoPersona: String, 16 | val rangoEdad: String, 17 | val sexo: Sexo, 18 | val lesividad: String, 19 | val positivoAlcohol: Boolean, 20 | val positivoDrogas: Boolean, 21 | ) { 22 | enum class Sexo { 23 | HOMBRE, MUJER, NO_ASIGNADO 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Soluciones/11-AccidentesMadrid/src/main/resources/Estructura_ConjuntoDatos_Accidentesv2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/11-AccidentesMadrid/src/main/resources/Estructura_ConjuntoDatos_Accidentesv2.pdf -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/.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-Ficheros-Serializacion/.idea/.name: -------------------------------------------------------------------------------- 1 | Ficheros-XML -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | } 4 | 5 | group = "dev.joseluisgs" 6 | version = "1.0-SNAPSHOT" 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | testImplementation("org.jetbrains.kotlin:kotlin-test") 14 | } 15 | 16 | tasks.test { 17 | useJUnitPlatform() 18 | } 19 | kotlin { 20 | jvmToolchain(21) 21 | } -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/data/venta.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/12-Ficheros-Serializacion/data/venta.dat -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/data/venta.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 1, 3 | "fecha": "2021-01-01", 4 | "cliente": { 5 | "nombre": "Pepe", 6 | "email": "pepe@pepe.com" 7 | }, 8 | "lineas": [ 9 | { 10 | "producto": { 11 | "nombre": "Laptop", 12 | "precio": 1000.0 13 | }, 14 | "cantidad": 1, 15 | "precio": 1000.0 16 | }, 17 | { 18 | "producto": { 19 | "nombre": "Ratón", 20 | "precio": 20.0 21 | }, 22 | "cantidad": 2, 23 | "precio": 20.0 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/data/venta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/12-Ficheros-Serializacion/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 27 15:16:48 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Ficheros-XML" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/src/main/kotlin/Main.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs 2 | 3 | import dev.joseluisgs.models.Cliente 4 | import dev.joseluisgs.models.Producto 5 | import dev.joseluisgs.models.Venta 6 | import java.io.File 7 | import java.io.ObjectInputStream 8 | import java.io.ObjectOutputStream 9 | import java.nio.file.Files 10 | import java.nio.file.Path 11 | 12 | fun main() { 13 | Files.createDirectories(Path.of("data")) 14 | 15 | // Crear un cliente 16 | val cliente = Cliente("Pepe", "pepe@pepe.com") 17 | val venta = Venta(1, "2021-01-01", cliente) 18 | venta.addLinea(Producto("Laptop", 1000.0), 1) 19 | venta.addLinea(Producto("Ratón", 20.0), 2) 20 | 21 | println(venta) 22 | 23 | val fileWriteSerialized = File("data/venta.dat") 24 | val oos = ObjectOutputStream(fileWriteSerialized.outputStream()) 25 | oos.use { 26 | it.writeObject(venta) 27 | } 28 | 29 | val fileReadSerialized = File("data/venta.dat") 30 | val ois = ObjectInputStream(fileReadSerialized.inputStream()) 31 | ois.use { 32 | val venta = it.readObject() as Venta 33 | println(venta) 34 | } 35 | 36 | } -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/src/main/kotlin/models/Cliente.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import java.io.Serializable 4 | 5 | data class Cliente( 6 | val nombre: String, 7 | val email: String, 8 | ) : Serializable -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/src/main/kotlin/models/Producto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import java.io.Serializable 4 | 5 | data class Producto( 6 | val nombre: String, 7 | val precio: Double, 8 | val stock: Long = 0, 9 | ) : Serializable -------------------------------------------------------------------------------- /Soluciones/12-Ficheros-Serializacion/src/main/kotlin/models/Venta.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import java.io.Serializable 4 | 5 | data class Venta( 6 | val id: Int, 7 | val fecha: String, 8 | val cliente: Cliente, 9 | ) : Serializable { 10 | private val lineas = mutableListOf() 11 | val total 12 | get() = lineas.sumOf { it.precio * it.cantidad } 13 | 14 | fun addLinea(producto: Producto, cantidad: Int) { 15 | lineas.add(LineaVenta(producto, cantidad, producto.precio)) 16 | } 17 | 18 | fun removeLinea(producto: Producto) { 19 | lineas.removeIf { it.producto == producto } 20 | } 21 | 22 | override fun toString(): String { 23 | return "Venta(id=$id, fecha='$fecha', cliente=$cliente, lineas=$lineas, total=$total)" 24 | } 25 | 26 | 27 | data class LineaVenta( 28 | val producto: Producto, 29 | val cantidad: Int, 30 | val precio: Double 31 | ) : Serializable 32 | } -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/.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-Ficheros-Binarios/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | } 4 | 5 | group = "dev.joseluisgs" 6 | version = "1.0-SNAPSHOT" 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | testImplementation("org.jetbrains.kotlin:kotlin-test") 14 | } 15 | 16 | tasks.test { 17 | useJUnitPlatform() 18 | } 19 | kotlin { 20 | jvmToolchain(21) 21 | } -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/data/hello.dat: -------------------------------------------------------------------------------- 1 | Hello, World! -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/data/hello.txt: -------------------------------------------------------------------------------- 1 | Hello, World! -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/13-Ficheros-Binarios/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Feb 28 20:36:40 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Ficheros-Binarios" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/13-Ficheros-Binarios/src/main/kotlin/Main.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs 2 | 3 | import java.nio.file.Files 4 | import java.nio.file.Path 5 | 6 | fun main() { 7 | Files.createDirectories(Path.of("data")) 8 | 9 | val file = Path.of("data", "hello.txt").toFile() 10 | file.writeText("Hello, World!") 11 | println(file.readText()) 12 | 13 | // Ahora en binario 14 | val fileBin = Path.of("data", "hello.dat").toFile() 15 | fileBin.writeBytes("Hello, World!".toByteArray()) 16 | println(fileBin.readBytes().toString(Charsets.UTF_8)) 17 | } -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/.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/14-Ficheros-Binarios-Venta/.idea/.name: -------------------------------------------------------------------------------- 1 | Ficheros-XML -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | } 4 | 5 | group = "dev.joseluisgs" 6 | version = "1.0-SNAPSHOT" 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | testImplementation("org.jetbrains.kotlin:kotlin-test") 14 | } 15 | 16 | tasks.test { 17 | useJUnitPlatform() 18 | } 19 | kotlin { 20 | jvmToolchain(21) 21 | } -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/data/venta.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/14-Ficheros-Binarios-Venta/data/venta.dat -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/data/venta.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 1, 3 | "fecha": "2021-01-01", 4 | "cliente": { 5 | "nombre": "Pepe", 6 | "email": "pepe@pepe.com" 7 | }, 8 | "lineas": [ 9 | { 10 | "producto": { 11 | "nombre": "Laptop", 12 | "precio": 1000.0 13 | }, 14 | "cantidad": 1, 15 | "precio": 1000.0 16 | }, 17 | { 18 | "producto": { 19 | "nombre": "Ratón", 20 | "precio": 20.0 21 | }, 22 | "cantidad": 2, 23 | "precio": 20.0 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/data/venta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/14-Ficheros-Binarios-Venta/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 27 15:16:48 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Ficheros-XML" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/src/main/kotlin/Main.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs 2 | 3 | import dev.joseluisgs.models.Cliente 4 | import dev.joseluisgs.models.Producto 5 | import dev.joseluisgs.models.Venta 6 | import java.io.* 7 | import java.nio.file.Files 8 | import java.nio.file.Path 9 | 10 | fun main() { 11 | Files.createDirectories(Path.of("data")) 12 | 13 | // Crear un cliente 14 | val cliente = Cliente("Pepe", "pepe@pepe.com") 15 | val venta = Venta(1, "2021-01-01", cliente) 16 | venta.addLinea(Producto("Laptop", 1000.0), 1) 17 | venta.addLinea(Producto("Ratón", 20.0), 2) 18 | 19 | println(venta) 20 | 21 | val fileWriteBytes = File("data/venta.dat") 22 | ByteArrayOutputStream().use { bos -> 23 | ObjectOutputStream(bos).use { oos -> 24 | oos.writeObject(venta) 25 | fileWriteBytes.writeBytes(bos.toByteArray()) 26 | } 27 | } 28 | 29 | val fileReadBytes = File("data/venta.dat") 30 | fileReadBytes.readBytes().let { bytes -> 31 | ObjectInputStream(ByteArrayInputStream(bytes)).use { ois -> 32 | val venta = ois.readObject() as Venta 33 | println(venta) 34 | } 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/src/main/kotlin/models/Cliente.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import java.io.Serializable 4 | 5 | data class Cliente( 6 | val nombre: String, 7 | val email: String, 8 | ) : Serializable -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/src/main/kotlin/models/Producto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import java.io.Serializable 4 | 5 | data class Producto( 6 | val nombre: String, 7 | val precio: Double, 8 | val stock: Long = 0, 9 | ) : Serializable -------------------------------------------------------------------------------- /Soluciones/14-Ficheros-Binarios-Venta/src/main/kotlin/models/Venta.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import java.io.Serializable 4 | 5 | data class Venta( 6 | val id: Int, 7 | val fecha: String, 8 | val cliente: Cliente, 9 | ) : Serializable { 10 | private val lineas = mutableListOf() 11 | val total 12 | get() = lineas.sumOf { it.precio * it.cantidad } 13 | 14 | fun addLinea(producto: Producto, cantidad: Int) { 15 | lineas.add(LineaVenta(producto, cantidad, producto.precio)) 16 | } 17 | 18 | fun removeLinea(producto: Producto) { 19 | lineas.removeIf { it.producto == producto } 20 | } 21 | 22 | override fun toString(): String { 23 | return "Venta(id=$id, fecha='$fecha', cliente=$cliente, lineas=$lineas, total=$total)" 24 | } 25 | 26 | 27 | data class LineaVenta( 28 | val producto: Producto, 29 | val cantidad: Int, 30 | val precio: Double 31 | ) : Serializable 32 | } -------------------------------------------------------------------------------- /Soluciones/15-Aemet/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/15-Aemet/.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/15-Aemet/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/15-Aemet/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/15-Aemet/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/15-Aemet/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/15-Aemet/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | kotlin("plugin.serialization") version "1.9.22" 4 | } 5 | 6 | group = "dev.joseluisgs" 7 | version = "1.0-SNAPSHOT" 8 | 9 | repositories { 10 | mavenCentral() 11 | } 12 | 13 | dependencies { 14 | // JSON 15 | implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") 16 | // XML 17 | implementation("io.github.pdvrieze.xmlutil:core-jvm:0.86.3") 18 | implementation("io.github.pdvrieze.xmlutil:serialization-jvm:0.86.3") 19 | 20 | testImplementation("org.jetbrains.kotlin:kotlin-test") 21 | } 22 | 23 | tasks.test { 24 | useJUnitPlatform() 25 | } 26 | kotlin { 27 | jvmToolchain(21) 28 | } -------------------------------------------------------------------------------- /Soluciones/15-Aemet/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/15-Aemet/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/15-Aemet/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/15-Aemet/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Feb 29 16:00:16 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/15-Aemet/reports/report-2024-02-29.json: -------------------------------------------------------------------------------- 1 | { 2 | "provincia": "Madrid", 3 | "temperaturaMediaMaxima": 21.463511720477648, 4 | "temperaturaMediaMinima": 9.314285714285708, 5 | "temperaturaMaxima": 25.2, 6 | "temperaturaMinima": -0.9, 7 | "precipitacionFechaNumLugaresMedia": [ 8 | ] 9 | } -------------------------------------------------------------------------------- /Soluciones/15-Aemet/reports/report-2024-02-29.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Soluciones/15-Aemet/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Aemet" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/15-Aemet/src/main/kotlin/models/Informe.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class Informe( 7 | val provincia: String, 8 | val temperaturaMediaMaxima: Double, 9 | val temperaturaMediaMinima: Double, 10 | val temperaturaMaxima: Double, 11 | val temperaturaMinima: Double, 12 | val precipitacionFechaNumLugaresMedia: List>> 13 | ) -------------------------------------------------------------------------------- /Soluciones/15-Aemet/src/main/kotlin/models/Medicion.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import java.time.LocalDate 4 | import java.time.LocalTime 5 | 6 | data class Medicion( 7 | val ciudad: String, 8 | val provincia: String, 9 | val fecha: LocalDate, 10 | val temperaturaMaxima: Double, 11 | val horaTemperaturaMaxima: LocalTime, 12 | val temperaturaMinima: Double, 13 | val horaTemperaturaMinima: LocalTime, 14 | val precipitacion: Double, 15 | ) -------------------------------------------------------------------------------- /Soluciones/15-Aemet/src/main/resources/Aemet20171029.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/15-Aemet/src/main/resources/Aemet20171029.csv -------------------------------------------------------------------------------- /Soluciones/15-Aemet/src/main/resources/Aemet20171031.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/15-Aemet/src/main/resources/Aemet20171031.csv -------------------------------------------------------------------------------- /Soluciones/15-Aemet/src/main/resources/README.md: -------------------------------------------------------------------------------- 1 | # Servicio meteorológico 2 | 3 | 1. Leer los tres ficheros y combinarlos en uno solo completando los datos e incluyendo el campo fecha 4 | 2. Exportar el resultado a Json y XML 5 | 3. Realizar las siguientes consultas: 6 | - Temperatura máxima por día y lugar 7 | - Temperatura mínima por día y lugar 8 | - Temperatura máxima por provincia (día, lugar, valor y momento) 9 | - Temperatura mínima por provincia (día, lugar, valor y valor) 10 | - Temperatura media por provincia (día, lugar y valor) 11 | - Listado de precipitación media por día y provincia 12 | - Numero de lugares en el que llovío por día y provincia 13 | - Temperatura média de la provincia de Madrid 14 | - Media de temperatura máxima total 15 | - Media de temprratura minima total 16 | - Lugares donde la máxima ha sido antes de las 15:00 por día 17 | - Lugares donde la mínima ha sido después de las 17:30 por día 18 | 19 | 4.- Para la privincia de Madid exportar en JSON y XML el siguiente informe 20 | - Por cada día: 21 | - Temperatura media 22 | - Temperatura máxima (Lugar y momento) 23 | - Temperatura mínima (Lugar y momento 24 | - Si hubo precipitación (sí/no) y valor de la misma. 25 | -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/.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/16-Ficheros-Aleatorio/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | } 4 | 5 | group = "dev.joseluisgs" 6 | version = "1.0-SNAPSHOT" 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | dependencies { 13 | testImplementation("org.jetbrains.kotlin:kotlin-test") 14 | } 15 | 16 | tasks.test { 17 | useJUnitPlatform() 18 | } 19 | kotlin { 20 | jvmToolchain(21) 21 | } -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/data/enteros.dat: -------------------------------------------------------------------------------- 1 | -8PFX -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/data/texto.txt: -------------------------------------------------------------------------------- 1 | Pepe se va a comprar, con 2 | Pedro. Pero Pepe se encuentra con Juan y se va a comprar con Juan. 3 | Pero ambos deberían ESTUDIAR para el examen de mañana de programación. todo Pepe que lo tiene más difícil. 4 | Pero sabemos que Pepe aprobará. -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/16-Ficheros-Aleatorio/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Mar 01 16:30:33 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/16-Ficheros-Aleatorio/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Ficheros-Aleatorio" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### IntelliJ IDEA ### 8 | .idea/modules.xml 9 | .idea/jarRepositories.xml 10 | .idea/compiler.xml 11 | .idea/libraries/ 12 | *.iws 13 | *.iml 14 | *.ipr 15 | out/ 16 | !**/src/main/**/out/ 17 | !**/src/test/**/out/ 18 | 19 | ### Eclipse ### 20 | .apt_generated 21 | .classpath 22 | .factorypath 23 | .project 24 | .settings 25 | .springBeans 26 | .sts4-cache 27 | bin/ 28 | !**/src/main/**/bin/ 29 | !**/src/test/**/bin/ 30 | 31 | ### NetBeans ### 32 | /nbproject/private/ 33 | /nbbuild/ 34 | /dist/ 35 | /nbdist/ 36 | /.nb-gradle/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | 41 | ### Mac OS ### 42 | .DS_Store -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/.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/18-Alumnado/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | kotlin("jvm") version "1.9.22" 3 | kotlin("plugin.serialization") version "1.9.22" 4 | } 5 | 6 | group = "dev.joseluisgs" 7 | version = "1.0-SNAPSHOT" 8 | 9 | repositories { 10 | mavenCentral() 11 | } 12 | 13 | dependencies { 14 | // JSON 15 | implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") 16 | // XML 17 | implementation("io.github.pdvrieze.xmlutil:core-jvm:0.86.3") 18 | implementation("io.github.pdvrieze.xmlutil:serialization-jvm:0.86.3") 19 | 20 | testImplementation("org.jetbrains.kotlin:kotlin-test") 21 | } 22 | 23 | tasks.test { 24 | useJUnitPlatform() 25 | } 26 | kotlin { 27 | jvmToolchain(21) 28 | } -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/data/alumnos.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/18-Alumnado/data/alumnos.bin -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/data/alumnos.csv: -------------------------------------------------------------------------------- 1 | numero,nombre,repetidor 2 | 1,Juan,false 3 | 2,Ana,true 4 | 3,Luis,false 5 | 4,María,true 6 | 5,Pedro,false 7 | 6,Lucía,true 8 | 7,Marta,false 9 | 8,Javier,true 10 | 9,Sara,false 11 | 10,Pablo,true 12 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/data/alumnos.dat: -------------------------------------------------------------------------------- 1 | JuanAnaLuisMaríaPedroLucíaMartaJavier Sara 2 | Pablo -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/data/alumnos.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "numero": 1, 4 | "nombre": "Juan", 5 | "repetidor": false 6 | }, 7 | { 8 | "numero": 2, 9 | "nombre": "Ana", 10 | "repetidor": true 11 | }, 12 | { 13 | "numero": 3, 14 | "nombre": "Luis", 15 | "repetidor": false 16 | }, 17 | { 18 | "numero": 4, 19 | "nombre": "María", 20 | "repetidor": true 21 | }, 22 | { 23 | "numero": 5, 24 | "nombre": "Pedro", 25 | "repetidor": false 26 | }, 27 | { 28 | "numero": 6, 29 | "nombre": "Lucía", 30 | "repetidor": true 31 | }, 32 | { 33 | "numero": 7, 34 | "nombre": "Marta", 35 | "repetidor": false 36 | }, 37 | { 38 | "numero": 8, 39 | "nombre": "Javier", 40 | "repetidor": true 41 | }, 42 | { 43 | "numero": 9, 44 | "nombre": "Sara", 45 | "repetidor": false 46 | }, 47 | { 48 | "numero": 10, 49 | "nombre": "Pablo", 50 | "repetidor": true 51 | } 52 | ] -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/data/alumnos.txt: -------------------------------------------------------------------------------- 1 | 1 2 | Juan 3 | false 4 | 2 5 | Ana 6 | true 7 | 3 8 | Luis 9 | false 10 | 4 11 | María 12 | true 13 | 5 14 | Pedro 15 | false 16 | 6 17 | Lucía 18 | true 19 | 7 20 | Marta 21 | false 22 | 8 23 | Javier 24 | true 25 | 9 26 | Sara 27 | false 28 | 10 29 | Pablo 30 | true 31 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/data/alumnos.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/Soluciones/18-Alumnado/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Mar 01 18:20:11 CET 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 3 | } 4 | rootProject.name = "Alumnado" 5 | 6 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/src/main/kotlin/Main.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs 2 | 3 | import dev.joseluisgs.factories.AlumnadoFactory 4 | import dev.joseluisgs.services.* 5 | 6 | fun main() { 7 | println("Hola Ficheros") 8 | 9 | println("Alumnos como texto...") 10 | val storageTexto = StorageTexto() 11 | storageTexto.save(AlumnadoFactory.alumnado) 12 | storageTexto.load().forEach { println(it) } 13 | 14 | println() 15 | println("Alumnos como CSV...") 16 | val storageCsv = StorageCsv() 17 | storageCsv.save(AlumnadoFactory.alumnado) 18 | storageCsv.load().forEach { println(it) } 19 | 20 | println() 21 | println("Alumnos como JSON...") 22 | val storageJson = StorageJson() 23 | storageJson.save(AlumnadoFactory.alumnado) 24 | storageJson.load().forEach { println(it) } 25 | 26 | println() 27 | println("Alumnos como XML...") 28 | val storageXml = StorageXml() 29 | storageXml.save(AlumnadoFactory.alumnado) 30 | storageXml.load().forEach { println(it) } 31 | 32 | println() 33 | println("Alumnos como Binario Serializable...") 34 | val storageSerializable = StorageSerializable() 35 | storageSerializable.save(AlumnadoFactory.alumnado) 36 | storageSerializable.load().forEach { println(it) } 37 | 38 | println() 39 | println("Alumnos como Binario...") 40 | val storageBinario = StorageBinario() 41 | storageBinario.save(AlumnadoFactory.alumnado) 42 | storageBinario.load().forEach { println(it) } 43 | 44 | } -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/src/main/kotlin/factories/AlumnadoFactory.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.factories 2 | 3 | import dev.joseluisgs.models.Alumno 4 | 5 | object AlumnadoFactory { 6 | val alumnado = listOf( 7 | Alumno(1, "Juan", false), 8 | Alumno(2, "Ana", true), 9 | Alumno(3, "Luis", false), 10 | Alumno(4, "María", true), 11 | Alumno(5, "Pedro", false), 12 | Alumno(6, "Lucía", true), 13 | Alumno(7, "Marta", false), 14 | Alumno(8, "Javier", true), 15 | Alumno(9, "Sara", false), 16 | Alumno(10, "Pablo", true), 17 | ) 18 | } -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/src/main/kotlin/models/Alumno.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.models 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | data class Alumno(val numero: Int, val nombre: String, val repetidor: Boolean) : java.io.Serializable 7 | 8 | -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/src/main/kotlin/services/Storage.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services 2 | 3 | import dev.joseluisgs.models.Alumno 4 | 5 | interface Storage { 6 | fun save(list: List) 7 | fun load(): List 8 | } -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/src/main/kotlin/services/StorageBinario.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services 2 | 3 | import dev.joseluisgs.models.Alumno 4 | import java.io.RandomAccessFile 5 | import java.nio.file.Files 6 | import java.nio.file.Paths 7 | import kotlin.io.path.Path 8 | 9 | class StorageBinario : Storage { 10 | private val file = Path("data", "alumnos.dat") 11 | 12 | init { 13 | Files.createDirectories(Paths.get("data")) 14 | } 15 | 16 | override fun save(list: List) { 17 | val fileRandom = RandomAccessFile(file.toFile(), "rw") 18 | fileRandom.use { 19 | // fileRandom.seek(it.length()) // Posiciona el puntero al final del fichero 20 | // fileRandom.seek(0) // Posiciona el puntero al principio del fichero 21 | list.forEach { alumno -> 22 | fileRandom.writeInt(alumno.numero) 23 | fileRandom.writeUTF(alumno.nombre) 24 | fileRandom.writeBoolean(alumno.repetidor) 25 | } 26 | } 27 | 28 | } 29 | 30 | override fun load(): List { 31 | val fileRandom = RandomAccessFile(file.toFile(), "r") 32 | val alumnos = mutableListOf() 33 | fileRandom.use { 34 | // fileRandom.seek(0) 35 | while (it.filePointer < it.length()) { 36 | val numero = it.readInt() // 4 bytes 37 | val nombre = it.readUTF() // 2 bytes + longitud 38 | val repetidor = it.readBoolean() // 1 byte 39 | // alumnos.add(Alumno(numero, nombre, repetidor)) 40 | } 41 | } 42 | return alumnos 43 | } 44 | } -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/src/main/kotlin/services/StorageCsv.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services 2 | 3 | import dev.joseluisgs.models.Alumno 4 | import java.nio.file.Files 5 | import java.nio.file.Paths 6 | import kotlin.io.path.Path 7 | import kotlin.io.path.appendText 8 | import kotlin.io.path.readLines 9 | import kotlin.io.path.writeText 10 | 11 | class StorageCsv : Storage { 12 | private val file = Path("data", "alumnos.csv") 13 | 14 | init { 15 | Files.createDirectories(Paths.get("data")) 16 | } 17 | 18 | override fun save(list: List) { 19 | val cabezera = "numero,nombre,repetidor\n" 20 | file.writeText(cabezera) 21 | list.forEach { 22 | file.appendText("${it.numero},${it.nombre},${it.repetidor}\n") 23 | } 24 | // file.appendText(list.joinToString(separator = "\n") { "${it.numero},${it.nombre},${it.repetidor}") 25 | } 26 | 27 | override fun load(): List { 28 | val list = mutableListOf() 29 | /*return file.readLines() 30 | .drop(1) 31 | .map { 32 | it.split(",") 33 | }.map { it -> 34 | Alumno(it[0].toInt(), it[1], it[2].toBoolean()) 35 | }*/ 36 | return file.readLines().drop(1) 37 | .map { 38 | val (numero, nombre, repetirdor) = it.split(",") 39 | Alumno(numero.toInt(), nombre, repetirdor.toBoolean()) 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/src/main/kotlin/services/StorageJson.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services 2 | 3 | import dev.joseluisgs.models.Alumno 4 | import kotlinx.serialization.encodeToString 5 | import kotlinx.serialization.json.Json 6 | import java.nio.file.Files 7 | import java.nio.file.Paths 8 | import kotlin.io.path.Path 9 | import kotlin.io.path.readText 10 | import kotlin.io.path.writeText 11 | 12 | class StorageJson : Storage { 13 | private val file = Path("data", "alumnos.json") 14 | 15 | init { 16 | Files.createDirectories(Paths.get("data")) 17 | } 18 | 19 | override fun save(list: List) { 20 | val json = Json { prettyPrint = true; ignoreUnknownKeys = true } 21 | file.writeText(json.encodeToString>(list)) 22 | } 23 | 24 | override fun load(): List { 25 | val json = Json { prettyPrint = true; ignoreUnknownKeys = true } 26 | return json.decodeFromString>(file.readText()) 27 | } 28 | } -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/src/main/kotlin/services/StorageSerializable.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services 2 | 3 | import dev.joseluisgs.models.Alumno 4 | import java.io.ObjectInputStream 5 | import java.io.ObjectOutputStream 6 | import java.nio.file.Files 7 | import java.nio.file.Paths 8 | import kotlin.io.path.Path 9 | import kotlin.io.path.inputStream 10 | import kotlin.io.path.outputStream 11 | 12 | class StorageSerializable : Storage { 13 | private val file = Path("data", "alumnos.bin") 14 | 15 | init { 16 | Files.createDirectories(Paths.get("data")) 17 | } 18 | 19 | override fun save(list: List) { 20 | ObjectOutputStream(file.outputStream()).use { 21 | list.forEach { al -> it.writeObject(al) } 22 | } 23 | 24 | // Otra es con la lista completa 25 | // ObjectOutputStream(file.outputStream()).use { 26 | // it.writeObject(list) 27 | // } 28 | 29 | } 30 | 31 | override fun load(): List { 32 | val alumnos = mutableListOf() 33 | 34 | ObjectInputStream(file.inputStream()).use { 35 | while (it.available() > 0) { 36 | val al = it.readObject() as Alumno 37 | alumnos.add(al) 38 | } 39 | } 40 | return alumnos 41 | 42 | // Otra es con la lista completa 43 | // ObjectInputStream(file.inputStream()).use { 44 | // return it.readObject() as List 45 | // } 46 | } 47 | } -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/src/main/kotlin/services/StorageTexto.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services 2 | 3 | import dev.joseluisgs.models.Alumno 4 | import java.nio.file.Files 5 | import java.nio.file.Paths 6 | import kotlin.io.path.Path 7 | import kotlin.io.path.appendText 8 | import kotlin.io.path.readLines 9 | import kotlin.io.path.writeText 10 | 11 | class StorageTexto : Storage { 12 | private val file = Path("data", "alumnos.txt") 13 | 14 | init { 15 | Files.createDirectories(Paths.get("data")) 16 | } 17 | 18 | override fun save(list: List) { 19 | // Forma rapida 20 | //val data = list.joinToString("\n") { "${it.numero},${it.nombre},${it.repetidor}" } 21 | // file.writeText(data) 22 | // uno por uno 23 | //list.forEach { 24 | // file.appendText("${it.numero},${it.nombre},${it.repetidor}\n") 25 | //} 26 | // Una línea por dato 27 | file.writeText("") 28 | list.forEach { 29 | file.appendText("${it.numero}\n") 30 | file.appendText("${it.nombre}\n") 31 | file.appendText("${it.repetidor}\n") 32 | } 33 | } 34 | 35 | override fun load(): List { 36 | val list = mutableListOf() 37 | /*file.bufferedReader().use { 38 | // Mientras haya una línea 39 | while (it.ready()) { 40 | val numero = it.readLine().toInt() 41 | val nombre = it.readLine() 42 | val repetidor = it.readLine().toBoolean() 43 | list.add(Alumno(numero, nombre, repetidor)) 44 | } 45 | }*/ 46 | // O con windowed(3, 3) o chunked(3) 47 | return file.readLines().chunked(3).map { 48 | Alumno(it[0].toInt(), it[1], it[2].toBoolean()) 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /Soluciones/18-Alumnado/src/main/kotlin/services/StorageXml.kt: -------------------------------------------------------------------------------- 1 | package dev.joseluisgs.services 2 | 3 | import dev.joseluisgs.models.Alumno 4 | import kotlinx.serialization.decodeFromString 5 | import kotlinx.serialization.encodeToString 6 | import nl.adaptivity.xmlutil.serialization.XML 7 | import java.nio.file.Files 8 | import java.nio.file.Paths 9 | import kotlin.io.path.Path 10 | import kotlin.io.path.readText 11 | import kotlin.io.path.writeText 12 | 13 | class StorageXml : Storage { 14 | private val file = Path("data", "alumnos.xml") 15 | 16 | init { 17 | Files.createDirectories(Paths.get("data")) 18 | } 19 | 20 | override fun save(list: List) { 21 | val xml = XML { indent = 4 } 22 | file.writeText(xml.encodeToString>(list)) 23 | } 24 | 25 | override fun load(): List { 26 | val xml = XML { } 27 | return xml.decodeFromString>(file.readText()) 28 | } 29 | } -------------------------------------------------------------------------------- /images/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/images/file.png -------------------------------------------------------------------------------- /images/java-io-vs-nio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/images/java-io-vs-nio.png -------------------------------------------------------------------------------- /images/jeraquia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joseluisgs/Programacion-07-2023-2024/9949bd9710e16caadcd30eb332e5d5eebe742d97/images/jeraquia.png --------------------------------------------------------------------------------