openxava / documentación / Configuración para Kotlin

Desde v7.0 puedes desarrollar fácilmente proyectos OpenXava con Kotlin usando OpenXava Studio, Eclipse, IntelliJ IDEA, entre otros. Kotlin es un lenguaje usado en la mayoría de las aplicaciones para Android y se puede desarrollar sobre JVM o JS. Una de las características es que Kotlin está diseñado para interoperar completamente con la sintaxis de Java, es decir que puedes compilar ambos códigos y que interactuen entre sí sin problemas.

Añadir dependencias en pom.xml

Después de haber creado un proyecto OpenXava (cómo hacerlo), debes definir la versión de Kotlin en properties en el archivo pom.xml ubicado en la carpeta raíz del proyecto:
<properties>
    <kotlin.version>1.8.0</kotlin.version>
</properties>
Añade la siguiente dependencia para usar la librería de Kotlin en dependencies:
<dependencies>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jdk8</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
</dependencies>
Para compilar proyectos que incluyan código Kotlin y Java, añade lo siguiente en build:
<build>
    <plugins>
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
                            <sourceDir>${project.basedir}/src/main/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <goals> <goal>test-compile</goal> </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
                            <sourceDir>${project.basedir}/src/test/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <executions>
                <!-- Replacing default-compile as it is treated specially by maven -->
                <execution>
                    <id>default-compile</id>
                    <phase>none</phase>
                </execution>
                <!-- Replacing default-testCompile as it is treated specially by maven -->
                <execution>
                    <id>default-testCompile</id>
                    <phase>none</phase>
                </execution>
                <execution>
                    <id>java-compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                <execution>
                    <id>java-test-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Prueba una entidad simple

Crea la carpeta kotlin en src/main para almacenar el código Kotlin y en la misma carpeta crea el paquete com.tuempresa.facturacion.modelo para las entidades OpenXava. Quizás debas hacer un Reload project en Maven para que puedas crear paquetes en la carpeta kotlin.

Crea una clase Kotlin en el paquete modelo con el nombre de Cliente (o un archivo Cliente.kt en Eclipse u OpenXava Studio):
package com.tuempresa.facturacion.modelo

import org.openxava.annotations.Required
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.Id

@Entity
class Cliente {

    @Id
    @Column(length = 6)
    var numero : Int ?= null

    @Required
    @Column(length = 50)
    var nombre : String ?= null

}

Empaqueta y ejecuta tu proyecto

Antes de ejecutar tu proyecto por primera vez debes hacer un mvn package, en las próximas basta con mvn compile. Después busca la clase facturacion dentro del paquete com.tuempresa.facturacion.run en src/main/java, y ejecútala. Luego en el navegador ingresa http://localhost:8080/facturacion e inicia sesión con admin/admin como usuario/contraseña para ver los resultados.

Otros ejemplos de código

Crear un botón simple (acción) donde muestra un mensaje, deja la clase Kotlin MostrarMensaje (MostrarMensaje.kt) en el paquete com.tuempresa.facturacion.accion de la carpeta kotlin:
package com.tuempresa.facturacion.accion

import org.openxava.actions.ViewBaseAction

class MostrarMensaje : ViewBaseAction() {

    @Throws(Exception::class)
    override fun execute() {
        addMessage("Hola Mundo!")
    }

 }
Recuerda que debes declarar la acción en controladores.xml que se encuentra en src/main/resources/xava:
<controlador nombre ="Cliente">
    <hereda-de controlador ="Typical"/>
    <accion nombre ="mostrarMensaje" clase ="com.tuempresa.facturacion.accion.MostrarMensaje" modo ="detail"/>
</controlador>
Una entidad con más características:
package com.tuempresa.facturacion.modelo

import org.openxava.annotations.*
import org.openxava.calculators.CurrentLocalDateCalculator
import org.openxava.calculators.CurrentYearCalculator
import org.openxava.model.Identifiable
import java.time.LocalDate
import javax.persistence.*

@Entity
@View(members="""
	anyo, numero, fecha,
    	datos {
    		cliente;
    		detalles;
    		observaciones 
} """ ) class Factura : Identifiable() { @Column(length = 4) @DefaultValueCalculator(CurrentYearCalculator::class) var anyo : Int? = null @Column(length = 6) var numero : Int? = null @Required @DefaultValueCalculator(CurrentLocalDateCalculator::class) var fecha : LocalDate? = null @ManyToOne(fetch = FetchType.LAZY, optional = false) @ReferenceView("Simple") var cliente : Cliente? = null @ElementCollection @ListProperties("producto.numero, producto.descripcion, cantidad") var detalles: Collection<Detalle>? = null @TextArea var observaciones : String? = null

 }
Si decides desarrollar tu proyecto OpenXava con Kotlin, recomendamos usar IntelliJ IDEA ya que viene con Kotlin incluido que ofrece autocompletado, coloreado de código, compilación automática, etc.
Puedes encontrar más detalles sobre Kotlin en su documentación y como integrar Kotlin en proyectos maven.
También puedes ver más sobre como usar OpenXava en nuestro curso desarrollado en Java.