1
resposta

Faça como eu fiz: gerando um arquivo json

Segue a resolução da atividade proposta.

Classe Titulo:

//imports

public class Titulo implements Comparable<Titulo>{
    private String nome;
    private int anoDeLancamento;
    private int duracaoEmMinutos;
    private boolean incluidoNoPlano;
    private double somaDasAvaliacoes;
    private int totalDeAvaliacoes;

    public Titulo(String nome, int anoDeLancamento) {
        this.nome = nome;
        this.anoDeLancamento = anoDeLancamento;
    }

    public Titulo(TituloOmdb tituloOmdb) {
        this.nome = tituloOmdb.title();

        if (tituloOmdb.year().length() > 4  || tituloOmdb.year().equals("N/A")) {
            this.anoDeLancamento = 0;
            throw new ErroDeConversaoDeAPIException("Data inconsistente ou não disponível");
        } else {
            this.anoDeLancamento = Integer.parseInt(tituloOmdb.year());
        }
        if (tituloOmdb.runtime().equals("N/A")) {
            this.duracaoEmMinutos = 0;
            throw new ErroDeConversaoDeAPIException("Duração não disponível");
        } else {
            this.duracaoEmMinutos = Integer.parseInt(tituloOmdb.runtime().replaceAll("[^0-9]", ""));
        }

    }
//Getters and setters.

    public double pegaMedia() {
        if (totalDeAvaliacoes != 0) {
            return somaDasAvaliacoes/totalDeAvaliacoes;
        } else {
            return 0.0;
        }
    }

    public void avalia(double avaliacao){
        somaDasAvaliacoes += avaliacao;
        totalDeAvaliacoes++;
    }

    @Override
    public String toString() {
        return  "(" + this.nome + " (" + this.anoDeLancamento + ")" +
                ", duração: " + this.duracaoEmMinutos + " minutos)\n";
    }


    @Override
    public int compareTo(Titulo o) {
        return this.getNome().compareTo(o.getNome());
    }
}

Record TituloOmdb:

package br.com.alura.screenmatch.modelos;

public record TituloOmdb(String title, String year, String runtime) {
}

Classe PrincipalComBusca:

//imports

public class PrincipalComBusca {
    public static void main(String[] args) throws IOException, InterruptedException {
        Scanner sc = new Scanner(System.in);
        Gson  gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();
        List<Titulo> listaDeTitulos = new LinkedList<>();

        String busca = "";
        while (!busca.equalsIgnoreCase("sair")) {
            System.out.println("Digite o nome do filme ou sair: ");
            busca = sc.nextLine();

            if (busca.equalsIgnoreCase("sair")) {
                break;
            }

            String nomeFilmeCodificado = URLEncoder.encode(busca, StandardCharsets.UTF_8);
            String OMDB_API_KEY = "api_key";
            String url = "https://www.omdbapi.com/?t=" + nomeFilmeCodificado + "&apikey=" + OMDB_API_KEY;

            ConsultaAPI consulta = new ConsultaAPI();
            String json = consulta.consultaAPI(url);
            System.out.println("Json de retorno da API: " + json);

            TituloOmdb tituloOmdb = gson.fromJson(json, TituloOmdb.class);
            System.out.println("TítuloOmdb: " + tituloOmdb);

            try {
                Titulo meuTitulo = new Titulo(tituloOmdb);
                System.out.println("Título convertido: " + meuTitulo);
                listaDeTitulos.add(meuTitulo);

            } catch (ErroDeConversaoDeAPIException e) {
                System.out.println("Houve um erro!");
                System.out.println(e.getMessage());
            }
        }
        FileWriter writer = new FileWriter("filmes.txt");
        writer.write(listaDeTitulos.toString());
        writer.close();
        System.out.println(listaDeTitulos);
        System.out.println("Fim do programa");
        sc.close();
    }
}

Output:

Digite o nome do filme ou sair: 
akira
Json de retorno da API: {"Title":"Akira","Year":"1988",...}
TítuloOmdb: TituloOmdb[title=Akira, year=1988, runtime=124 min]
Título convertido: (Akira (1988), duração: 124 minutos)

Digite o nome do filme ou sair: 
cyberpunk
Json de retorno da API: {"Title":"Cyberpunk","Year":"1990",...}
TítuloOmdb: TituloOmdb[title=Cyberpunk, year=1990, runtime=60 min]
Título convertido: (Cyberpunk (1990), duração: 60 minutos)

Digite o nome do filme ou sair: 
animatrix
Json de retorno da API: {"Title":"The Animatrix","Year":"2003",...}
TítuloOmdb: TituloOmdb[title=The Animatrix, year=2003, runtime=100 min]
Título convertido: (The Animatrix (2003), duração: 100 minutos)

Digite o nome do filme ou sair: 
sair
[(Akira (1988), duração: 124 minutos)
, (Cyberpunk (1990), duração: 60 minutos)
, (The Animatrix (2003), duração: 100 minutos)
]
Fim do programa

Process finished with exit code 0
1 resposta

Olá, Raoni! Como vai?

Parabéns pela resolução da atividade!

Observei que você explorou o uso de construtores sobrecarregados para tratar diferentes formas de inicialização, utilizou muito bem a exceção personalizada para lidar com dados inconsistentes da API e ainda compreendeu a importância da serialização e persistência ao salvar os títulos em arquivo.

Permaneça postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!