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:
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.
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:
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:
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:
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í:
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.
Se te pedirá importar el modelo.
Y, finalmente, deberías poder reutilizar la biblioteca.
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: