Modelo Java

O modelo Java é o conjunto de classes que modelam os objectos 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 implementar um comportamento específico em Java para os recursos e ainda decompõe 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 modelo de objecto na memória para representar a estrutura de um programa Java. Esta estrutura deriva do caminho de classes do projectos. O modelo é hierárquico. Os elementos do programa podem ser decompostos em elementos descendentes.

A manipulação dos elementos Java é semelhante à manipulação dos objectos de recurso. Quando trabalha com um elemento Java, está de facto a trabalhar com um handle para algum objecto de modelo subjacente. Tem de utilizar o protocolo exists() para indicar se o elemento está de facto presente na área de trabalho. 

A tabela seguinte resume os diversos géneros de elementos Java.

Elemento Descrição
IJavaModel Representa um elemento Java de raiz que corresponde aa área de trabalho. O ascendente de todos os projectos com natureza Java. Também dá acesso a projectos sem natureza Java.
IJavaProject Representa um projecto Java na área de trabalho. (Descendente de IJavaModel)
IPackageFragmentRoot Representa um conjunto de fragmentos de pacote e correlaciona os fragmentos com um recurso subjacente que é um pasta ou um ficheiro JAR ou ZIP. (Descendente de IJavaProject)
IPackageFragment Representa a porção na área de trabalho que corresponde a um pacote inteiro ou a uma porção do pacote. (Descendente de IPackageFragmentRoot )
ICompilationUnit Representa um ficheiro de fonte Java (.java). (Descendente de IPackageFragment )
IPackageDeclaration Representa uma declaração de pacote numa unidade de compilação. (Descendente de ICompilationUnit )
IImportContainer Representa a recolha de declarações de importação do pacote numa unidade de compilação. (Descendente de ICompilationUnit )
IImportDeclaration Representa uma única declaração de importação do pacote. (Descendente de IImportContainer )
IType Representa um tipo fonte dentro da unidade de compilação ou um tipo binário dentro de um ficheiro de classes.
IField Representa um campo dentro de um tipo. (Descendente de IType )
IMethod Representa um método ou um construtor dentro de um tipo. (Descendente de IType )
IInitializer Representa um operador de inicialização estático ou de instância dentro de um tipo. (Descendente de IType )
IClassFile Representa um tipo compilado (binário).  (Descendente de IPackageFragment )
ITypeParameter Representa um parâmetro de tipo.  (Sem ser um elemento descendente de um elemento Java, é obtido através da utilização de IType.getTypeParameter(String) ou IMethod.getTypeParameter(String))
ILocalVariable Representa uma variável local num método ou inicializador.  (Sem ser um elemento descendente de um elemento Java, é obtido através da utilização de ICodeAssist.codeSelect(int, int))

Todos os elementos Java suportam a interface IJavaElement.

Alguns dos elementos são apresentados na vista Pacotes.  Estes elementos implementam a interface IOpenable, pois têm de estar abertos antes de serem navegados. A figura abaixo mostra como estes elementos são representados na vista Pacotes.

A Vista Pacotes mostra
elementos que implementam a interface IOpenable

Os elementos Java que implementam a interface IOpenable são inicialmente criados com base nas informações encontradas nos ficheiros de recursos subjacentes. Os mesmos elementos são representados de forma genérica na vista do navegador de recursos.

O Navegador de Recursos
mostra os elementos que implementam a interface IOpenable

Os elementos restantes correspondem a artigos que compõem uma unidade de compilação Java. A figura abaixo mostra uma unidade de compilação Java e um esquematizador de conteúdo que apresenta os elementos fonte na unidade de compilação.

Um editor e um
esquematizador de conteúdo que ilustram a relação entre os respectivos
elementos fonte

Estes elementos implementam a interface ISourceReference, já que facultam o respectivo código fonte. (Como estes elementos são seleccionados no esquematizador de conteúdo, o respectivo código fonte é apresentado no editor Java.)

Os elementos Java e os respectivos recursos

Muitos dos elementos Java correspondem aos recursos genéricos na área de trabalho. Quando pretende criar elementos Java de um recurso genérico, a classe JavaCore é o melhor ponto de partida. O fragmento de código seguinte mostra como obter elementos Java a partir dos respectivos recursos correspondentes.

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

Assim que obtiver um elemento Java, pode utilizar a API JDT para percorrer e consultar o modelo. Pode também consultar os recursos não Java contidos no elemento Java. 

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

Projectos Java

Quando cria um projecto Java de um simples projecto, o JavaCore vai ver se o projecto está configurado com natureza Java. O plug-in JDT utiliza a natureza do projecto para designar um projecto como tendo um comportamento Java. Esta natureza (org.eclipse.jdt.core.JavaCore#NATURE_ID) é atribuída a um projecto quando o assistente "Novo Projecto Java" cria projecto. Se a natureza Java não estiver configurada no projecto, o JavaCore devolve NULL quando lhe é pedido para criar o projecto.

O JavaCore também é utilizado para manter o caminho de classes Java, incluindo as localizações para encontrar códigos fonte e bibliotecas e localizações para gerar ficheiros binários de saída (.class).

Quais as características específicas de projectos Java? Registam o seu caminho de classes num ficheiro ".classpath" e adicionam o construtor de projecto de incremento Java às especificações de construção do projecto. De resto, são apenas projectos normais e podem ser configurados com outras naturezas (e outros construtores de incremento) por plug-ins. Os plug-ins que podem configurar os projectos com comportamento Java além do seu próprio comportamento utilizam normalmente a NewJavaProjectWizardPage para atribuir a natureza Java ao projecto além dos respectivos comportamentos e naturezas personalizados.

O IJavaModel pode ser considerado como o ascendente de todos os projectos na área de trabalho que têm um natureza de projecto Java (e, por conseguinte, podem ser tratados como um IJavaProject).