O JavaFilesExtractor é uma ferramenta em Java que extrai todos os arquivos .java de um repositório GitHub, concatenando-os em um único arquivo de texto com metadados e sem blocos de comentários /* */. Ideal para análise de código, auditoria ou geração de documentação de projetos Java, especialmente em contextos que envolvem processamento por algoritmos de inteligência artificial.
O objetivo principal do JavaFilesExtractor é extrair código-fonte Java de repositórios GitHub e normalizá-lo para reduzir o ruído na entrada de algoritmos de Large Language Models (LLMs). Ao remover blocos de comentários /* */ e estruturar o código com metadados claros (nome do arquivo, pacote e declaração), o projeto facilita o uso do código em tarefas como análise automatizada, geração de documentação ou treinamento de modelos de IA, garantindo uma entrada mais limpa e padronizada.
- Download Automático: Baixa o ZIP da branch padrão de um repositório GitHub.
- Extração de Arquivos: Descompacta o ZIP e identifica todos os arquivos
.java. - Concatenação com Metadados: Gera um arquivo de texto contendo:
- Nome do arquivo (
// FILE: NomeDoArquivo.java). - Pacote declarado (
// PACKAGE: nome.do.pacoteou(default)). - Declaração principal (
// DECLARATION: class Nomeou similar). - Código-fonte sem blocos de comentários
/* */. - Marca de fim (
// END_OF_FILE).
- Nome do arquivo (
- Limpeza de Comentários: Remove blocos de comentários
/* */, preservando comentários de linha//. - Gerenciamento de Recursos: Exclui arquivos temporários (ZIP e diretórios) após o uso.
- Java 11 ou superior: O projeto usa a API
HttpCliente outras funcionalidades modernas. - Dependências:
- Jackson Databind para parsing de JSON.
- Inclua no seu arquivo pom.xml (Maven):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.0</version>
</dependency>-
Clone o repositório:
git clone https://github.com/seu-usuario/java-files-extractor.git cd java-files-extractor -
Importe e compile/rode o projeto (usa Maven) na sua IDE de preferencia: Certifique-se de que a dependência Jackson Databind foi carregada pela IDE
-
Insira o Repositório: Quando solicitado, digite o repositório no formato
usuario/repositorio(ex.:rgiovann/pratt_parser). -
Saída: Um arquivo de texto (ex.:
usuario_repositorio_timestamp.txt) será gerado no diretório atual, contendo todos os arquivos.javaconcatenados com metadados.
Para um arquivo App.java no repositório rgiovann/pratt_parser:
package parser.prat_parser;
public class App {
public static void main(String[] args) {
String input = "4+3*5 + 4/6 - (3+4)*7";
PrattParser parser = new PrattParser(LexerFactory.createDefaultLexer(input));
Expression parsed = parser.parse();
System.out.println("INPUT : " + input);
System.out.println("OUTPUT : " + parsed.toString());
}
}O arquivo de saída (rgiovann_pratt_parser_20250509_123456.txt) conterá:
// FILE: App.java
// PACKAGE: parser.prat_parser
// DECLARATION: class App
package parser.prat_parser;
public class App {
public static void main(String[] args) {
String input = "4+3*5 + 4/6 - (3+4)*7";
PrattParser parser = new PrattParser(LexerFactory.createDefaultLexer(input));
Expression parsed = parser.parse();
System.out.println("INPUT : " + input);
System.out.println("OUTPUT : " + parsed.toString());
}
}
// END_OF_FILE
O projeto segue boas práticas de programação orientada a objetos, com ênfase nos princípios SOLID, KISS e DRY:
- Single Responsibility Principle (SRP): Cada método tem uma única responsabilidade (ex.:
extractPackageNameextrai o pacote,removeCommentsremove blocos de comentários). - Open/Closed Principle (OCP): A lógica é extensível, permitindo adicionar novas funcionalidades (ex.: novas tags) sem modificar o núcleo.
- Keep It Simple, Stupid (KISS): Soluções simples, como regex para parsing de pacotes e comentários, evitam complexidade desnecessária.
- Don't Repeat Yourself (DRY): Funções reutilizáveis (ex.:
extractDeclaration) evitam duplicação de código.
O código usa a API moderna do Java (HttpClient, Files, Path) para eficiência e robustez, com tratamento adequado de erros e recursos (ex.: fechamento automático com try-with-resources).
O JavaFilesExtractor é ideal para projetos Java de tamanho pequeno a médio, com até ~4.000 linhas de código ou ~20.000 tokens. Tokens são unidades de texto processadas por IAs, onde ~4-5 caracteres correspondem a um token em código Java (ex.: public class pode ser ~2-3 tokens). A maioria das IAs modernas suporta contextos de:
- Grok 3 (xAI): Até ~128.000 tokens.
- GPT-4 (OpenAI): Até ~32.000 ou 128.000 tokens, dependendo da variante.
- Claude (Anthropic): Até ~200.000 tokens.
Para respostas precisas, recomendamos fornecer arquivos com 10.000 a 20.000 tokens, reservando espaço para perguntas e respostas da IA. Projetos nessa faixa, como o rgiovann/ds-catalog, são bem processados sem sobrecarregar o modelo.
O repositório público rgiovann/ds-catalog é um exemplo prático. O arquivo gerado pelo JavaFilesExtractor para este projeto contém:
- ~85.257 caracteres (excluindo espaços, tabulações e quebras de linha).
- ~21.300 tokens (média de ~4 caracteres por token).
- ~2.500 linhas totais, com ~2.125 linhas não vazias.
Com ~21.300 tokens, o arquivo está no limite superior para projetos médios e pode ser processado por IAs como Grok 3 ou GPT-4. Para tarefas específicas (ex.: analisar apenas a classe ProductService), recomendamos extrair trechos menores (ex.: ~5.000-10.000 tokens) para maior precisão.
Para projetos muito grandes, com mais de ~4.000 linhas ou ~20.000 tokens, o arquivo gerado pode exceder os limites de contexto de algumas IAs ou reduzir a qualidade das respostas devido à diluição do foco. Nesses casos, sugere-se o split manual do arquivo gerado em arquivos menores.
Em uma versão futura desse extrator, planeja-se informar ao usuário a opção de gerar os arquivos normalizados por pacote.
O arquivo passo_a_passo_java_extrator.pdf descreve em detalhes o funcionamento do extrator.