Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

Mejorando mi app de Proyectos

package principal;

import modelo.Proyecto;
import persistencia.ProyectoRepositoryJson;
import servicio.ProyectoService;

import java.util.List;
import java.util.Scanner;

public class Principal {

public static void main(String[] args) {

    Scanner leer = new Scanner(System.in);

    ProyectoRepositoryJson repo =
            new ProyectoRepositoryJson("data/proyectos.json");

    ProyectoService service = new ProyectoService(repo);

    int opcion;

    do {
        System.out.println("\n=== GESTOR DE PROYECTOS (JSON) ===");
        System.out.println("1. Agregar proyecto");
        System.out.println("2. Listar proyectos");
        System.out.println("3. Salir");

        opcion = leerEntero(leer, "Opción: ");

        switch (opcion) {
            case 1 -> {
                try {
                    Proyecto p = new Proyecto();

                    System.out.print("Nombre: ");
                    p.setNombre(leer.nextLine());

                    System.out.print("Cliente: ");
                    p.setCliente(leer.nextLine());

                    p.setDuracionMeses(leerEntero(leer, "Duración meses: "));
                    p.setId(System.currentTimeMillis()); // id simple

                    service.crear(p);
                    System.out.println(" Guardado en JSON");
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }

            case 2 -> {
                List<Proyecto> proyectos = service.listar();
                if (proyectos.isEmpty()) {
                    System.out.println("No hay proyectos.");
                } else {
                    proyectos.forEach(System.out::println);
                }
            }

            case 3 -> System.out.println("Saliendo...");
        }

    } while (opcion != 3);

    leer.close();
}

private static int leerEntero(Scanner sc, String msg) {
    while (true) {
        System.out.print(msg);
        if (sc.hasNextInt()) {
            int n = sc.nextInt();
            sc.nextLine();
            return n;
        }
        System.out.println(" Ingrese número válido");
        sc.nextLine();
    }
}

}

2 respuestas

import java.util.List;

public class ProyectoRepositoryJson {

private final File archivo;
private final Gson gson;
private final Type tipoLista = new TypeToken<List<Proyecto>>(){}.getType();

public ProyectoRepositoryJson(String rutaArchivo) {
    this.archivo = new File(rutaArchivo);
    this.gson = new GsonBuilder().setPrettyPrinting().create();
}

public List<Proyecto> leerTodos() {
    try {
        if (!archivo.exists() || archivo.length() == 0) {
            return new ArrayList<>();
        }

        try (FileReader reader = new FileReader(archivo)) {
            List<Proyecto> proyectos = gson.fromJson(reader, tipoLista);
            return proyectos != null ? proyectos : new ArrayList<>();
        }

    } catch (Exception e) {
        throw new RuntimeException("Error leyendo JSON de proyectos", e);
    }
}

public void guardarTodos(List<Proyecto> proyectos) {
    try {
        File parent = archivo.getParentFile();
        if (parent != null && !parent.exists()) parent.mkdirs();

        try (FileWriter writer = new FileWriter(archivo)) {
            gson.toJson(proyectos, writer);
        }

    } catch (Exception e) {
        throw new RuntimeException("Error guardando JSON de proyectos", e);
    }
}

public void agregar(Proyecto proyecto) {
    List<Proyecto> proyectos = leerTodos();
    proyectos.add(proyecto);
    guardarTodos(proyectos);
}

}

package modelo;

public class Proyecto {
private Long id;
private String nombre;
private String cliente;
private int duracionMeses;

public Proyecto() {
}


public Proyecto(Long id, String nombre, String cliente, int duracionMeses) {
    this.id = id;
    this.nombre = nombre;
    this.cliente = cliente;
    this.duracionMeses = duracionMeses;
}


public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    if (nombre == null || nombre.isBlank()) {
        throw new IllegalArgumentException("El nombre no puede estar vacío");
    }
    this.nombre = nombre;
}

public String getCliente() {
    return cliente;
}

public void setCliente(String cliente) {
    if (cliente == null || cliente.isBlank()) {
        throw new IllegalArgumentException("El cliente no puede estar vacío");
    }
    this.cliente = cliente;
}

public int getDuracionMeses() {
    return duracionMeses;
}

public void setDuracionMeses(int duracionMeses) {
    if (duracionMeses <= 0) {
        throw new IllegalArgumentException("La duración debe ser mayor a 0");
    }
    this.duracionMeses = duracionMeses;
}


public void mostrarProyecto() {
    System.out.println(this);
}

@Override
public String toString() {
    return "Proyecto{" +
            "id=" + id +
            ", nombre='" + nombre + '\'' +
            ", cliente='" + cliente + '\'' +
            ", duracionMeses=" + duracionMeses +
            '}';
}