A Arquitetura

O objetivo central deste projeto foi desenvolver uma aplicação via linha de comando capaz de ler o código HTML a partir de uma URL e localizar o texto contido no nível estrutural mais profundo.

A restrição técnica proibia o uso de frameworks externos e pacotes DOM prontos. A solução foi desenhada utilizando processamento de Strings e controle de fluxo através de uma Stack (Pilha) para mapear hierarquias de abertura e fechamento de tags. Foram incluídos tratamentos de borda precisos, emitindo "URL connection error" em falhas de rede e monitorando consistência estrutural para alertar "malformed HTML" em caso de anomalias.

Source Code

HtmlAnalyzer.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Stack;

public class HtmlAnalyzer {

    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("URL connection error");
            return;
        }

        Stack<String> pilha = new Stack<>();
        int actualDepth = 0;
        int maxDepth = 0;
        String finalOutput = "";

        try {
            URL url = new URL(args[0]);
            BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
            String line;

            while ((line = reader.readLine()) != null) {
                line = line.trim();
                if (line.isEmpty()) continue;

                if (isTagOpen(line)) {
                    String tag = extractTagName(line);
                    pilha.push(tag);
                    actualDepth++;
                } else if (isTagClose(line)) {
                    String tag = extractTagName(line);
                    if (pilha.isEmpty() || !pilha.peek().equals(tag)) {
                        System.out.println("malformed HTML");
                        return;
                    }
                    pilha.pop();
                    actualDepth--;
                } else {
                    if (actualDepth > maxDepth) {
                        maxDepth = actualDepth;
                        finalOutput = line;
                    }
                }
            }

            if (!pilha.isEmpty()) {
                System.out.println("malformed HTML");
                return;
            }

            System.out.println(finalOutput);

        } catch (Exception e) {
            System.out.println("URL connection error");
        }
    }

    private static boolean isTagOpen(String line) {
        return line.startsWith("<") && !line.startsWith("</");
    }

    private static boolean isTagClose(String line) {
        return line.startsWith("</");
    }

    private static String extractTagName(String line) {
        return line.replaceAll("[<>/]", "");
    }
}