Modelo Java

O gabarito Java é o conjunto de classes que modelam os objetos associados à criação, edição e construção de um programa Java. As classes do modelo Java estão definidas em org.eclipse.jdt.core.  Estas classes implementam o comportamento específico do Java em recursos e, além disso, decompõem os recursos Java em elementos de modelo.

Elementos Java

O pacote org.eclipse.jdt.core define as classes que modelam os elementos que compõem um programa Java. O JDT utiliza um gabarito de objeto em memória para representar a estrutura de um programa Java. Esta estrutura é derivada do classpath do projeto. O modelo é hierárquico. Os elementos de um programa podem ser decompostos em elementos filhos.

A manipulação de elementos Java é semelhante à manipulação de objetos de recurso.  Ao trabalhar com um elemento Java, você está, na verdade, trabalhando com um identificador de algum objeto de modelo subjacente.  Você deve usar o protocolo exists() para determinar se o elemento está realmente presente no espaço de trabalho. 

A tabela a seguir resume os diferentes tipos de elementos Java.

Element Descrição
IJavaModel Representa o elemento Java raiz, correspondente à área de trabalho. O pai de todos os projetos de natureza Java. Também fornece acesso aos projetos sem natureza java.
IJavaProject Representa um projeto Java na área de trabalho. (Filho de IJavaModel )
IPackageFragmentRoot Representa um conjunto de fragmentos de pacote e mapeia os fragmentos para um recurso subjacente que é uma pasta, ou um arquivo JAR, ou um ZIP. (Filho de IJavaProject )
IPackageFragment Representa a parte da área de trabalho que corresponde a um pacote inteiro ou a uma parte do pacote. (Filho de IPackageFragmentRoot )
ICompilationUnit Representa um arquivo de origem Java (.java).(Filho de IPackageFragment )
IPackageDeclaration Representa uma declaração de pacote em uma unidade de compilação. (Filho de ICompilationUnit )
IImportContainer Representa a coleção de declarações de importação de pacote em uma unidade de compilação. (Filho de ICompilationUnit )
IImportDeclaration Representa uma única declaração de importação de pacote. (Filho de IImportContainer )
IType Representa um tipo de origem dentro de uma unidade de compilação ou um tipo binário dentro de um arquivo de classe.
IField Representa um campo dentro de um tipo. (Filho de IType )
IMethod Representa um método ou construtor dentro de um tipo. (Filho de IType )
IInitializer Representa um inicializador estático ou de ocorrência dentro de um tipo. (Filho de IType )
IClassFile Representa um tipo compilado (binário).  (Filho de IPackageFragment )

Todos os elementos Java suportam a interface IJavaElement.

Alguns dos elementos são mostrados na visualização Pacotes.  Estes elementos implementam a interface IOpenable , já que precisam ser abertos para serem navegados. A figura a seguir mostra como esses elementos são representados na visualização Pacotes.

Visualização Pacotes mostrando elementos que implementam a interface IOpenable

Os elementos Java que implementam IOpenable são criados, principalmente, com as informações encontradas nos arquivos de recurso subjacentes.  Os mesmos elementos são representados genericamente na visualização do navegador de recursos.

Navegador de Recursos mostrando elementos que implementam a interface IOpenable

Outros elementos correspondem aos itens que constituem uma unidade de compilação Java. A figura a seguir mostra uma unidade de compilação Java e um contornador de conteúdo que exibe os elementos de origem na unidade de compilação.

Um editor e um  delineador de conteúdo ilustrando a relação entre elementos de origem correspondentes

Estes elementos implementam a interface, ISourceReference, já que podem fornecer códigos fonte correspondentes. (À medida que esses elementos são selecionados no Outline de conteúdo, seus códigos fonte correspondentes são mostrados no editor Java).

Elementos Java e seus Recursos

Muitos dos elementos Java correspondem a recursos genéricos no espaço de trabalho.  A classe JavaCore é o melhor local para iniciar quando se deseja criar elementos Java a partir de um recurso genérico. O trecho de código a seguir mostra como obter elementos Java de seus recursos correspondentes.

    
private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) {
IJavaProject myJavaProject = JavaCore.create(myProject);if (myJavaProject == null)// o projeto não está configurado para Java (não possui natureza Java)     return;
            
// obter um fragmento de pacote ou raiz de fragmento de pacoteIJavaElement myPackageFragment = JavaCore.create(myFolder);        
// obter um .java (unidade de compilação), .class (arquivo de classe) ou// .jar (raiz de fragmento de pacote)IJavaElement myJavaFile = JavaCore.create(myFile);    }

Assim que você tem um elemento Java, pode utilizar a API do JDT para percorrer e consultar o modelo.  Também pode consultar os recursos não-Java contidos em um elemento Java. 

         private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) {
        ...
        // obter os recursos não-Java contidos em meu projeto.
        Object[] nonJavaChildren = myJavaProject.getNonJavaResources();
        ...
            

Projetos Java

Quando um projeto Java é criado a partir de um projeto simples, JavaCore verificará se o projeto está configurado com a natureza Java.  O plug-in JDT utiliza a natureza de um projeto para especificar um projeto como tendo comportamento Java.  Esta natureza (org.eclipse.jdt.core.JavaCore#NATURE_ID ) é atribuída a um projeto quando o assistente "Novo projeto Java" cria um projeto.  Se a natureza Java não estiver configurada em um projeto, JavaCore retornará nulo quando for solicitado a criar o projeto.

JavaCore também é utilizado para manter o caminho da classe Java, incluindo localizações para procurar código fonte e bibliotecas, e localizações para gerar arquivos (.class) binários de saída.

Quais são as características exclusivas de projetos Java? Eles registram seu classpath em um arquivo ".classpath" e adicionam o construtor de projeto incremental Java à especificação de construção do projeto.  Caso contrário, eles são apenas projetos regulares e podem ser configurados com outras naturezas (e outros construtores incrementais) pelos plug-ins. Os plug-ins que configuram projetos com o comportamento Java, além de seu próprio comportamento, utilizam geralmente NewJavaProjectWizardPage para atribuir a natureza Java ao projeto além de suas próprias naturezas ou comportamentos personalizados.

IJavaModel pode ser considerado o pai de todos os projetos na área de trabalho que possuem a natureza do projeto Java (e, portanto, podem ser tratados como um IJavaProject).