Documentation for a newer release is available. View Latest

REUSE1 - Crear una biblioteca DSL reutilizable

Esta sección cubre cómo crear una biblioteca DSL reutilizable. Con esto nos referimos a:

  • Un conjunto de componentes DSL que puedan conectarse a un proyecto de implementación (flujo) diferente.

  • El código de implementación para esos componentes.

Al crear una biblioteca reutilizable de esta manera, podemos crear componentes plug and play.

Crear un proyecto nuevo

Lo primero que necesitamos es crear un proyecto nuevo. Hagámoslo usando el project scaffolder:

mvn com.iconsolutions.ipf.build:ipf-project-scaffolder-maven:X.X.X:scaffold \
-DipfVersion=XXXX.X.X \
-DincludeBusinessFunctions=n \
-DincludeSampleSystems=n \
-DincludeApplication=n \
-DincludeE2E=n \
-DuseBuildScripts=y \
-DsolutionName=librarysolution \
-DmodelName=librarymodel \
-DflowName=SampleDomain \
-DprojectName=reuselibrary \
-DgroupId=com.iconsolutions \
-Dversion=0.0.1-SNAPSHOT \
-DartifactId=tutorial-reuse-library \
-DoutputDir=tutorial-reuse-library
Sustituye X.X.X y XXXX.X.X por los números de versión apropiados del scaffolder y de IPF. Las versiones deben ser compatibles; consulta la documentación de versiones de IPF.
Las propiedades definidas aquí deberían resultarte familiares, pero lo clave es que, al definir bibliotecas reutilizables, debemos establecer useBuildScripts en 'y'. Esto indica al proyecto que incluya los ajustes que permiten empaquetar y publicar el zip de MPS. Sin ello, no podríamos incorporarlo correctamente a otro proyecto.

Observa que no hemos incluido los módulos E2E ni application. Esto se debe a que, en este escenario, la biblioteca no será una solución standalone ("runnable").

Crear la biblioteca reutilizable

Ahora entremos a crear el proyecto. Para empezar, constrúyelo y ábrelo en MPS como harías con un proyecto de flujo normal. Verás que, en lugar de crear un flujo, te proporciona un dominio externo de ejemplo:

create reuse 1

Simplificaremos e implementaremos esto. Veamos el proyecto de código. Lo primero a notar es que el proyecto service aquí es como cualquier otro proyecto IPF que hemos construido y, de hecho, se aplican los mismos enfoques.

create reuse 2

En nuestra clase de configuración vemos la construcción estándar del dominio:

@Bean
public LibrarymodelDomain librarymodelDomain(ActorSystem actorSystem, Dispatcher floDispatcher) {
    // All adapters should be added to the domain model
    return new LibrarymodelDomain.Builder(actorSystem)
            .build();
}

Para esta demo, aplicaremos un sencillo "rebote" (bounce back), es decir, devolver inmediatamente una respuesta de dominio de ejemplo al propio dominio. Obviamente, en implementaciones reales haríamos otra cosa aquí, como llamar a un sistema remoto.

@Bean
public LibrarymodelDomain librarymodelDomain(ActorSystem actorSystem, Dispatcher floDispatcher) {
    // All adapters should be added to the domain model
    return new LibrarymodelDomain.Builder(actorSystem)
            .withSampleDomainActionAdapter(action -> LibrarymodelDomain.sampleDomain().handle(new SampleResponseInput.Builder(action.getId()).build()).thenAccept(done -> log.info("Completed a call into the sample domain.")))
            .build();
}

¡Eso es todo! Nuestra biblioteca reutilizable está lista. Primero, construyámosla. Si miras en tu repositorio maven verás:

create reuse 3

Aquí, lo importante es la creación del archivo zip. Un zip es el equivalente MPS de un jar estándar en maven.

Probémosla ahora.

Usar la biblioteca

Empecemos creando un proyecto nuevo. Esta vez haremos un proyecto basado en flujo:

mvn com.iconsolutions.ipf.build:ipf-project-scaffolder-maven:X.X.X:scaffold \
-DipfVersion=XXXX.X.X \
-DincludeBusinessFunctions=n \
-DincludeSampleSystems=n \
-DincludeApplication=y \
-DincludeE2E=n \
-DuseBuildScripts=n \
-DsolutionName=clientsolution \
-DmodelName=clientmodel \
-DprojectName=reusetest \
-DgroupId=com.iconsolutions \
-Dversion=0.0.1-SNAPSHOT \
-DartifactId=tutorial-reuse-client \
-DoutputDir=tutorial-reuse-client
Sustituye X.X.X y XXXX.X.X por las versiones correctas del scaffolder y de IPF. Deben ser compatibles; consulta la documentación de versiones de IPF.

En el comando anterior, hemos cambiado los flags para: crear un proyecto de aplicación y no usar build scripts. Esto nos proporcionará un proyecto de flujo básico para usar.

Antes de empezar, añadamos la dependencia a la nueva biblioteca que creamos. Para ello, abre el pom.xml del módulo mps:

create reuse 4

Luego, en la sección maven-dependency-plugins, añade la siguiente ejecución:

<execution>
    <id>unpack-tutorial-library-plugin</id>
    <phase>initialize</phase>
    <goals>
        <goal>unpack</goal>
    </goals>
    <configuration>
        <artifactItems>
            <artifactItem>
                <groupId>com.iconsolutions.reuselibrary.domain</groupId>
                <artifactId>mps</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <type>zip</type>
                <overWrite>true</overWrite>
                <outputDirectory>${plugin_home}</outputDirectory>
            </artifactItem>
        </artifactItems>
    </configuration>
</execution>

Valores clave a notar:

  • id: puede ser cualquiera; lo clave es asegurar su unicidad entre ejecuciones. Como buena práctica, un nombre descriptivo como el de arriba ayuda.

  • groupId: tendrá el formato <maven-group-id>.<project-name>.domain, donde maven-group-id y project-name son los definidos en el comando de creación. Si no proporcionaste projectName, solutionName pasa a ser el projectName. Puedes comprobar tus valores mirando la ruta en el repositorio maven.

  • artifactId: será mps.

  • version: es la versión maven del proyecto de la biblioteca.

Con esto basta por ahora; construyamos el proyecto. Esto traerá las dependencias como cualquier proyecto maven. Una vez finalizado, abre MPS y verás el flujo de ejemplo estándar:

create reuse 5

Añadiremos un simple paso extra a nuestro flujo para llamar a la nueva función reutilizable. Para ello, crea un estado 'In Progress' y cambia el initiation behaviour para que lo invoque. Por último, elige realizar una acción (de momento no tendrás acciones para elegir), de modo que se verá así:

create reuse 6

Ahora elige importar la nueva biblioteca. Para ello, simplemente pulsa Ctrl+R dos veces para abrir el cuadro de importación como siempre y busca SampleDomain.

create reuse 7

Se te pedirá importar el modelo.

create reuse 8

Y, finalmente, deberías poder reutilizar la biblioteca.

create reuse 9

Completa el flujo, según corresponda, añadiendo:

  • Un evento para cuando se reciba la respuesta, por ejemplo 'Response Received'.

  • Un input behaviour que mapee la respuesta de ejemplo al nuevo evento.

  • Un event behaviour para completar el flujo cuando se reciba el evento.

Por último, debemos indicar a nuestra aplicación dónde obtener la implementación de nuestro dominio de petición de ejemplo. Para ello, añadimos la dependencia service del proyecto de biblioteca a nuestro proyecto service cliente:

<dependency>
    <groupId>com.iconsolutions</groupId>
    <artifactId>tutorial-reuse-library-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

Ahora construyamos el proyecto de nuevo y arranquémoslo (nota: necesitarás un mongo y una developer-app en ejecución para que la aplicación arranque). Luego, podemos enviar la petición curl de ejemplo para lanzar un pago, que podrás ver en la developer app para comprobar que se ha procesado correctamente y que usa nuestro dominio de biblioteca:

create reuse 10

Conclusiones

En esta sección hemos aprendido a crear una biblioteca reutilizable, con el código de implementación necesario para poder incorporarla en otro proyecto.