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.
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.
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.
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.
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.)
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(); ...
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).