Modelo Java

El modelo Java es el conjunto de clases que modelan los objetos asociados al proceso de crear, editar y construir un programa Java. Las clases del modelo Java están definidas en org.eclipse.jdt.core. Estas clases implementan comportamientos específicos de Java para los recursos y descomponen adicionalmente los recursos Java en elementos del modelo.

Elementos Java

El paquete org.eclipse.jdt.core define las clases que modelan los elementos que componen un programa Java. Las herramientas de desarrollo Java (JDT) utilizan un modelo de objetos en memoria para representar la estructura de un programa Java. Esta estructura se deriva de la vía de acceso de clases del proyecto. El modelo es jerárquico. Los elementos de un programa pueden descomponerse en elementos hijo.

El proceso de manipular elementos Java es similar al de manipular objetos de recurso. Cuando trabaja con un elemento Java, en realidad está trabajando con un handle de un objeto de modelo subyacente. Para determinar si el elemento está realmente presente en el espacio de trabajo, debe utilizar el protocolo exists()

En la tabla siguiente figura un resumen de los distintos tipos de elementos Java.

Elemento Descripción
IJavaModel Representa el elemento Java raíz correspondiente al espacio de trabajo. Es el padre de todos los proyectos que tienen la naturaleza Java. También proporciona acceso a los proyectos que no tienen la naturaleza Java.
IJavaProject Representa un proyecto Java del espacio de trabajo. (Hijo de IJavaModel)
IPackageFragmentRoot Representa un conjunto de fragmentos de paquete y correlaciona los fragmentos con un recurso subyacente, que es una carpeta, un archivo JAR o un archivo ZIP. (Hijo de IJavaProject)
IPackageFragment Representa la parte del espacio de trabajo que corresponde a un paquete completo o a una parte del paquete. (Hijo de IPackageFragmentRoot)
ICompilationUnit Representa un archivo fuente Java (.java). (Hijo de IPackageFragment)
IPackageDeclaration Representa una declaración de paquete en una unidad de compilación. (Hijo de ICompilationUnit)
IImportContainer Representa la colección de declaraciones de importación de paquetes de una unidad de compilación. (Hijo de ICompilationUnit)
IImportDeclaration Representa una sola declaración de importación de paquete. (Hijo de IImportContainer)
IType Representa o bien un tipo fuente en una unidad de compilación o bien un tipo binario en un archivo de clase.
IField Representa un campo dentro de un tipo. (Hijo de IType)
IMethod Representa un método o un constructor dentro de un tipo. (Hijo de IType)
IInitializer Representa un inicializador estático o de instancia dentro de un tipo. (Hijo de IType)
IClassFile Representa un tipo compilado (binario). (Hijo de IPackageFragment

Todos los elementos Java dan soporte a la interfaz IJavaElement.

Algunos de los elementos aparecen en la vista Paquetes. Estos elementos implementan la interfaz IOpenable, porque para poder navegar por ellos, primero hay que abrirlos. La figura siguiente muestra cómo se representan estos elementos en la vista Paquetes.

Vista Paquetes que muestra elementos que implementan la interfaz IOpenable

Los elementos Java que implementan la interfaz IOpenable se crean básicamente a partir de la información existente en los archivos de recursos subyacentes. Esos mismos elementos se representan de manera genérica en la vista del navegador de recursos. 

Vista Navegador de recursos que muestra elementos que implementan la interfaz IOpenable

Otros elementos se corresponden con los elementos que componen una unidad de compilación Java. En la figura siguiente se muestra una unidad de compilación Java y un esquematizador de contenido que visualiza los elementos fuente de la unidad de compilación.

Un editor y un esquematizador de contenido que ilustran la relación entre los correspondientes elementos fuente

Estos elementos implementan la interfaz ISourceReference, porque pueden proporcionar el correspondiente código fuente. (A medida que vayan seleccionándose los elementos en el esquematizador de contenido, se irá mostrando su código fuente correspondiente en el editor Java).

Elementos Java y sus recursos

Muchos de los elementos Java se corresponden con recursos genéricos del espacio de trabajo. La clase JavaCore será su mejor punto de partida cuando le interese crear elementos Java a partir de un recurso genérico. El fragmento de código siguiente muestra cómo obtener elementos Java a partir de sus recursos correspondientes.

    
private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) {
        IJavaProject myJavaProject= JavaCore.create(myProject);
        if (myJavaProject == null)
    // el proyecto no está configurado para Java (no tiene naturaleza Java)
            return;
            
    // obtener un fragmento de paquete o el directorio raíz de un fragmento de paquete
        IJavaElement myPackageFragment= JavaCore.create(myFolder);
        
    // obtener un .java (unidad de compilación), .class (archivo de clase) o
    // .jar (directorio raíz de fragmento de paquete)
        IJavaElement myJavaFile = JavaCore.create(myFile);
    }

Cuando ya tenga un elemento Java, podrá utilizar la API de JDT para cruzar el modelo y hacer consultas. También podrá hacer consultas sobre los recursos no Java que haya en un elemento Java.  

         private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) {
        ...
        // Obtener los recursos no Java que existan en mi proyecto.
        Object[] nonJavaChildren = myJavaProject.getNonJavaResources();
        ...
            

Proyectos Java

Cuando crea un proyecto Java a partir de un proyecto simple, la clase JavaCore hará una comprobación para ver si el proyecto está configurado con la naturaleza Java. El conector JDT utiliza una naturaleza para designar que un proyecto tiene un comportamiento Java. Esta naturaleza (org.eclipse.jdt.core.JavaCore#NATURE_ID) se asigna a un proyecto cuando el asistente "Proyecto Java nuevo" crea un proyecto. Si un proyecto no tiene configurada la naturaleza Java, la clase JavaCore devolverá null cuando se le pida que cree el proyecto.

La clase JavaCore también se utiliza para mantener la vía de acceso de clases Java, incluidas las ubicaciones para localizar el código fuente y las bibliotecas, y las ubicaciones para generar archivos binarios de salida (.class).

¿Cuáles son las características exclusivas de los proyectos Java? Los proyectos Java registran sus vías de acceso de clases en un archivo ".classpath" y añaden el constructor incremental de proyectos Java a la especificación de construcción del proyecto. Aparte de esto, son tan solo proyectos normales y se pueden configurar con otras naturalezas (y con otros constructores incrementales) mediante conectores. Los conectores que tengan interés en configurar los proyectos con un comportamiento Java además del suyo propio suelen utilizar la clase NewJavaProjectWizardPage para asignar al proyecto la naturaleza Java, además de sus naturalezas o comportamientos personalizados propios.

La interfaz IJavaModel puede considerarse como padre de todos los proyectos del espacio de trabajo que tienen naturaleza de proyecto Java (y, por lo tanto, pueden tratarse como interfaz IJavaProject).