<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Edgar Rios Navarro</title>
    <description>The latest articles on DEV Community by Edgar Rios Navarro (@e240683).</description>
    <link>https://dev.to/e240683</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F596767%2F91be3231-c59c-4d17-9459-19ac0a94e333.jpg</url>
      <title>DEV Community: Edgar Rios Navarro</title>
      <link>https://dev.to/e240683</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/e240683"/>
    <language>en</language>
    <item>
      <title>Jira Java API</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Wed, 13 Aug 2025 15:22:22 +0000</pubDate>
      <link>https://dev.to/e240683/jira-java-api-3l6k</link>
      <guid>https://dev.to/e240683/jira-java-api-3l6k</guid>
      <description>&lt;p&gt;Jira provee un REST API, del que se abordó en el post anterior: &lt;a href="https://dev.to/e240683/cliente-jira-mediante-cookie-5f3n"&gt;https://dev.to/e240683/cliente-jira-mediante-cookie-5f3n&lt;/a&gt;. Pero también, provee un &lt;strong&gt;Java API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para este caso, importar dos librerías específicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jira-rest-java-client-core&lt;/li&gt;
&lt;li&gt;fugue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Luego, implementar la autenticación (mediante &lt;em&gt;cookie&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Finalmente, invocar la búsqueda del &lt;em&gt;Issue&lt;/em&gt; y acceder a sus propiedades.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.atlassian.com/server/jira/platform/java-apis/" rel="noopener noreferrer"&gt;https://developer.atlassian.com/server/jira/platform/java-apis/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jira</category>
      <category>java</category>
      <category>api</category>
      <category>backend</category>
    </item>
    <item>
      <title>Cliente Jira mediante Cookie</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Thu, 06 Mar 2025 17:08:27 +0000</pubDate>
      <link>https://dev.to/e240683/cliente-jira-mediante-cookie-5f3n</link>
      <guid>https://dev.to/e240683/cliente-jira-mediante-cookie-5f3n</guid>
      <description>&lt;p&gt;Aunque acceder a Jira mediante Cookie es una funcionalidad deprecada, sigue siendo una alternativa en entornos restrictivos al uso del Token.&lt;/p&gt;

&lt;p&gt;En Typescript existe una librería recomendada por su reducido tamaño:&lt;br&gt;
&lt;a href="https://github.com/UrielCh/jira-api/" rel="noopener noreferrer"&gt;https://github.com/UrielCh/jira-api/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El fork que utiliza la opción de Cookie lo subí al siguiente repositorio: &lt;a href="https://github.com/edgargs/jira-api/tree/feature/client-cookie" rel="noopener noreferrer"&gt;https://github.com/edgargs/jira-api/tree/feature/client-cookie&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este bloque de código, demuestra el cambio en la creación del cliente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Deno&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JRA_DOMAIN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Deno&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JRA_COOKIE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jira&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JiraClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;COOKIE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cookie&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El valor del cookie se obtiene de la sesión activa en el navegador web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusi0h4riraaf8rm6g7b8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusi0h4riraaf8rm6g7b8.png" alt="Image description" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>jira</category>
      <category>programming</category>
    </item>
    <item>
      <title>Procesar miles de registros con Spring-Batch</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Tue, 26 Sep 2023 22:51:33 +0000</pubDate>
      <link>https://dev.to/e240683/procesar-miles-de-registros-con-spring-batch-81h</link>
      <guid>https://dev.to/e240683/procesar-miles-de-registros-con-spring-batch-81h</guid>
      <description>&lt;p&gt;Pongamos como contexto, que se necesita &lt;strong&gt;leer&lt;/strong&gt; desde una base de datos origen y &lt;strong&gt;grabar&lt;/strong&gt; en otra base de datos distinta. Con el propósito de realizar resúmenes y cuadres diarios.&lt;/p&gt;




&lt;p&gt;Lo más eficiente será no depender de algún ORM. Por lo que se recomienda emplear JDBC.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Spring-Batch&lt;/em&gt; provee un &lt;em&gt;JdbcPagingItemReader&lt;/em&gt; el cual, al recuperar los registros de manera paginada no ocupará memoria en retener todo el resultado de la consulta. &lt;/p&gt;

&lt;p&gt;También tenemos un &lt;em&gt;JdbcBatchItemWriter&lt;/em&gt; para grabar los registros, que los grabarán usando la capacidad &lt;strong&gt;batch&lt;/strong&gt; del &lt;em&gt;driver&lt;/em&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.spring.io/spring-batch/docs/current/reference/html/readersAndWriters.html#database"&gt;https://docs.spring.io/spring-batch/docs/current/reference/html/readersAndWriters.html#database&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html#scalability"&gt;https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html#scalability&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>mysql</category>
      <category>oracle</category>
      <category>spring</category>
    </item>
    <item>
      <title>MySQL usar tipo SET para validar</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Tue, 04 Jul 2023 15:00:57 +0000</pubDate>
      <link>https://dev.to/e240683/mysql-usar-tipo-set-para-validar-p28</link>
      <guid>https://dev.to/e240683/mysql-usar-tipo-set-para-validar-p28</guid>
      <description>&lt;p&gt;Cuando diseñamos un sistema y tenemos una lista restringida de opciones, el modelo ER nos mostrará una relación de 'muchos a muchos'.&lt;/p&gt;

&lt;p&gt;Consideremos el caso de Usuario - Roles:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bvU-behQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rrm144ee62bmn1iyts6e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bvU-behQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rrm144ee62bmn1iyts6e.png" alt="Image description" width="741" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El diagrama nos indica que debemos crear tres tablas.&lt;/p&gt;




&lt;p&gt;Como alternativa, en MySQL nos proporciona el tipo &lt;em&gt;SET&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h2b0YvUo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/le2bs6i3qwr5jwskifxt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h2b0YvUo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/le2bs6i3qwr5jwskifxt.png" alt="Image description" width="634" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dicho campo acepta ninguno, uno o más valores de la lista.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; insert into user(email,name,password) 
values('a@greatsolutions.consulting','A','A');
Query OK, 1 row affected (0.04 sec)

mysql&amp;gt; insert into user(email,name,password,roles) 
values('b@greatsolutions.consulting','B','B','');
Query OK, 1 row affected (0.04 sec)

mysql&amp;gt; insert into user(email,name,password,roles) 
values('c@greatsolutions.consulting','C','C','editor,user');
Query OK, 1 row affected (0.04 sec)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por el contrario, nos da error cuando intentamos insertar un valor diferente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; insert into user(email,name,password,roles) 
values('d@greatsolutions.consulting','D','D','root');
ERROR 1265 (01000): Data truncated for column 'roles' at row 1
mysql&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.mysql.com/doc/refman/8.0/en/set.html"&gt;https://dev.mysql.com/doc/refman/8.0/en/set.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>database</category>
      <category>mysql</category>
    </item>
    <item>
      <title>Autoincrement en Oracle</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Wed, 21 Jun 2023 16:41:48 +0000</pubDate>
      <link>https://dev.to/e240683/autoincrement-en-oracle-20ja</link>
      <guid>https://dev.to/e240683/autoincrement-en-oracle-20ja</guid>
      <description>&lt;p&gt;Consideremos el &lt;em&gt;script&lt;/em&gt; original, basado en la versión 11g:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;---------&lt;/span&gt;
&lt;span class="c1"&gt;-- 11g --&lt;/span&gt;
&lt;span class="c1"&gt;---------&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt; 
&lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;PK_ID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;SEQUENCE&lt;/span&gt; &lt;span class="n"&gt;SEQ_ORDERS&lt;/span&gt;
 &lt;span class="k"&gt;START&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt;     &lt;span class="mi"&gt;1000&lt;/span&gt;
 &lt;span class="k"&gt;INCREMENT&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt;   &lt;span class="mi"&gt;1&lt;/span&gt;
 &lt;span class="n"&gt;NOCACHE&lt;/span&gt;
 &lt;span class="n"&gt;NOCYCLE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;TRG_I_ORDERS&lt;/span&gt;
&lt;span class="k"&gt;BEFORE&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt;
   &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt;
   &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
   &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SEQ_ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NEXTVAL&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anteriormente, se empleaba un &lt;em&gt;trigger&lt;/em&gt; para incrementar el &lt;strong&gt;ID&lt;/strong&gt;: recuperar el valor de un &lt;em&gt;sequence&lt;/em&gt; y asignarlo al campo. &lt;/p&gt;




&lt;p&gt;Desde la versión 12c, obtenemos la misma funcionalidad con &lt;strong&gt;IDENTITY Column&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;---------&lt;/span&gt;
&lt;span class="c1"&gt;-- 12c --&lt;/span&gt;
&lt;span class="c1"&gt;---------&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt; &lt;span class="k"&gt;GENERATED&lt;/span&gt; &lt;span class="n"&gt;ALWAYS&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html#GUID-F9CE0CC3-13AE-4744-A43C-EAC7A71AAAB6__CJAECCFH"&gt;Oracle:Database:identity_clause&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>database</category>
      <category>backend</category>
    </item>
    <item>
      <title>Procesar una transacción completamente con TRANSACT-SQL</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Fri, 28 Apr 2023 14:06:29 +0000</pubDate>
      <link>https://dev.to/e240683/procesar-una-transaccion-remota-xml-con-transact-sql-de5</link>
      <guid>https://dev.to/e240683/procesar-una-transaccion-remota-xml-con-transact-sql-de5</guid>
      <description>&lt;p&gt;Consideremos que, la cadena XML se genera en el servidor de aplicación. Se emplea la configuración de Spring para usar JAXB2. &lt;/p&gt;

&lt;p&gt;Debemos asignar una lista de detalle (listCollectionSpendReport) a la entidad que vamos a persistir (collection). Nótese que, previamente se grababa la entidad y luego, uno por uno, los detalles.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;El procedimiento almacenado, recibe los datos de la entidad principal y una cadena de los detalles. Luego, son casteados en formato &lt;em&gt;XML&lt;/em&gt; y recorridos en una sentencia &lt;strong&gt;SELECT&lt;/strong&gt; para ser insertados en la tabla correspondiente.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://docs.spring.io/spring-ws/site/reference/html/oxm.html"&gt;http://docs.spring.io/spring-ws/site/reference/html/oxm.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sqlserver</category>
      <category>transactsql</category>
      <category>java</category>
      <category>backend</category>
    </item>
    <item>
      <title>Enviar geoposición desde el backend con Primefaces y Gmaps.</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Fri, 14 Apr 2023 13:48:57 +0000</pubDate>
      <link>https://dev.to/e240683/enviar-geoposicion-desde-el-backend-con-primefaces-y-gmaps-og9</link>
      <guid>https://dev.to/e240683/enviar-geoposicion-desde-el-backend-con-primefaces-y-gmaps-og9</guid>
      <description>&lt;p&gt;Este ejemplo muestra como interactuar con información del backend y el frontend. Específicamente, enviar una posición y mostrarla en un mapa (google maps).&lt;/p&gt;

&lt;p&gt;Recuperamos la latitud y longitud (posiblemente desde la base de datos) en el controller.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;La posición lo almacenamos en variables de javascript. En la página web, también tendremos dos input's para mostrar cómo va cambiando la posición al mover el marker.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Creamos el mapa y colocamos el marker. Agregamos los eventos para mostrar la posición actual.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/maps/documentation/javascript/examples/"&gt;https://developers.google.com/maps/documentation/javascript/examples/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>jsf</category>
      <category>gmaps</category>
    </item>
    <item>
      <title>Procesar una transacción remota (XML) mediante un procedimiento almacenado</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Fri, 10 Mar 2023 15:50:29 +0000</pubDate>
      <link>https://dev.to/e240683/procesar-una-transaccion-remota-xml-mediante-un-procedimiento-almacenado-5d39</link>
      <guid>https://dev.to/e240683/procesar-una-transaccion-remota-xml-mediante-un-procedimiento-almacenado-5d39</guid>
      <description>&lt;p&gt;Para enviar información (transaccional) hacia una base de datos centralizada, prodríamos emplear un servicio web: recibe los datos y los persiste de forma autónoma, segura y confiable. Pero como alternativa, es invocar un procedimiento almacenado remoto. &lt;/p&gt;

&lt;p&gt;Consideremos la limitante que no podemos enviar la información en formato JSON. La versión del motor no lo soporta: Oracle 11g. La solución será emplear el formato XML. &lt;/p&gt;

&lt;p&gt;No pasemos por alto los riesgos de enviar la información no cifrada (el sistema está en una red privada o no), el tamaño de los datos y el costo de procesamiento del servidor.&lt;/p&gt;




&lt;p&gt;Este ejemplo nuestra cómo generar el formato XML en el cliente. Se etiqueta los bean's con la anotación  @XmlRootElement. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;El procedimiento para interpretar el xml y grabar las tablas correspondientes. La solución es válida para todas las base de datos relacionales (como Postgres y Sql Server), aunque el código varía entre ellas.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/edgargs/Ejemplo-2016-01.git"&gt;https://github.com/edgargs/Ejemplo-2016-01.git&lt;/a&gt;&lt;br&gt;
&lt;a href="http://howtodoinjava.com/jaxb/jaxb-exmaple-marshalling-and-unmarshalling-list-or-set-of-objects/"&gt;http://howtodoinjava.com/jaxb/jaxb-exmaple-marshalling-and-unmarshalling-list-or-set-of-objects/&lt;/a&gt; &lt;br&gt;
&lt;a href="http://viralpatel.net/blogs/oracle-xmltable-tutorial/"&gt;http://viralpatel.net/blogs/oracle-xmltable-tutorial/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>xml</category>
      <category>oracle</category>
      <category>java</category>
      <category>backend</category>
    </item>
    <item>
      <title>JTable Color Header</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Sat, 28 Jan 2023 16:12:39 +0000</pubDate>
      <link>https://dev.to/e240683/jtable-color-header-e0k</link>
      <guid>https://dev.to/e240683/jtable-color-header-e0k</guid>
      <description>&lt;p&gt;A diferencia de las aplicaciones web, personalizar grillas (tablas) en Java Swing requiere de mucho más código. Pero podemos ayudarnos con clases utilitarias.&lt;/p&gt;




&lt;h2&gt;
  
  
  1) Original
&lt;/h2&gt;

&lt;p&gt;Consideremos este ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8h450iqjxk20ikm51gut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8h450iqjxk20ikm51gut.png" alt="Image description" width="719" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2) Column Group
&lt;/h2&gt;

&lt;p&gt;Para agregar la capacidad de agrupar columnas, emplearemos una clase llamada &lt;em&gt;ColumnGroup&lt;/em&gt;. Reconoce el título y las columnas que debe agrupar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ColumnGroup&lt;/span&gt; &lt;span class="n"&gt;columnGroup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="n"&gt;columnGroup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ColumnGroup&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Precio Venta "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"S/."&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;UtilityTable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initSelectList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jTable&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tableModel&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ConstantsVentas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;columnsList&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
&lt;span class="n"&gt;columnGroup&lt;/span&gt; &lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6fuvftvufhujihqh9drw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6fuvftvufhujihqh9drw.png" alt="Image description" width="719" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3) Color Header
&lt;/h2&gt;

&lt;p&gt;También podemos cambiar el color de columnas específicas. Ello lo conseguimos indicando en la clase &lt;em&gt;FarmaColumnData&lt;/em&gt;, el color de fondo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkgqg2tg44uj5yhmqwiyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkgqg2tg44uj5yhmqwiyu.png" alt="Image description" width="695" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9i50ayv1zrmhcuwh42s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9i50ayv1zrmhcuwh42s.png" alt="Image description" width="723" height="297"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.oracle.com/javase/tutorial/uiswing/components/table.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/javase/tutorial/uiswing/components/table.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/edgargs/table-color-header.git" rel="noopener noreferrer"&gt;https://github.com/edgargs/table-color-header.git&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>frontend</category>
      <category>html</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Mock Service with Groovy</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Thu, 08 Dec 2022 12:30:18 +0000</pubDate>
      <link>https://dev.to/e240683/mock-service-with-groovy-a4a</link>
      <guid>https://dev.to/e240683/mock-service-with-groovy-a4a</guid>
      <description>&lt;p&gt;Cuando dependemos de una servicio de tercero, nos encontraremos con la situación que dicho servicio no está disponible por un tiempo. Para eliminar esa dependencia, podemos crear un &lt;em&gt;MockService&lt;/em&gt; por nuestra cuenta.&lt;/p&gt;

&lt;p&gt;En el ecosistema de &lt;strong&gt;Groovy&lt;/strong&gt;, existe una librería que nos facilita: RatPack.&lt;/p&gt;




&lt;p&gt;En una solo archivo, configuramos los métodos y las respuestas. Es posible agregarle lógica, pero la intención es que tengamos respuesta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"io.ratpack:ratpack-groovy:1.3.3"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;ratpack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groovy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Groovy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ratpack&lt;/span&gt;
&lt;span class="n"&gt;ratpack&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;handlers&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Transaccion.asmx/getAffiliationSearch"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;byMethod&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contentType&lt;/span&gt; &lt;span class="s2"&gt;"text/xml"&lt;/span&gt;
          &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt; &lt;span class="s1"&gt;'''&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
            &amp;lt;ArrayOfStAffiliationSearch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="https://mifarmaws02.orbisfarma.com.mx/"&amp;gt;
                &amp;lt;stAffiliationSearch&amp;gt;
                    &amp;lt;transactionid&amp;gt;183477976581&amp;lt;/transactionid&amp;gt;
                    &amp;lt;cardnumber&amp;gt;D007330811&amp;lt;/cardnumber&amp;gt;
                    &amp;lt;accountnumber&amp;gt;D007330811&amp;lt;/accountnumber&amp;gt;
                    &amp;lt;cardname&amp;gt;VILMA ALEJANDRINA&amp;lt;/cardname&amp;gt;
                    &amp;lt;cardlastname&amp;gt;FERNANDEZ@RUIZ&amp;lt;/cardlastname&amp;gt;
                    &amp;lt;cardbirthdate&amp;gt;19641008&amp;lt;/cardbirthdate&amp;gt;
                    &amp;lt;cardgender&amp;gt;F&amp;lt;/cardgender&amp;gt;
                    &amp;lt;carddoctor /&amp;gt;
                    &amp;lt;cardcontactpreferences&amp;gt;1&amp;lt;/cardcontactpreferences&amp;gt;
                    &amp;lt;cardemail /&amp;gt;
                    &amp;lt;cardphone /&amp;gt;
                    &amp;lt;cardcellphone /&amp;gt;
                    &amp;lt;cardaddress&amp;gt;| | | | | |&amp;lt;/cardaddress&amp;gt;
                    &amp;lt;cardrelated&amp;gt;8601080650271&amp;lt;/cardrelated&amp;gt;
                    &amp;lt;cardfields&amp;gt;0&amp;lt;/cardfields&amp;gt;
                    &amp;lt;errorid&amp;gt;0&amp;lt;/errorid&amp;gt;
                    &amp;lt;message /&amp;gt;
                    &amp;lt;transactiondate&amp;gt;2022-11-24 18:00:00&amp;lt;/transactiondate&amp;gt;
                &amp;lt;/stAffiliationSearch&amp;gt;
            &amp;lt;/ArrayOfStAffiliationSearch&amp;gt;'''&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mock-service.groovy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al consultar:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faa5u08nndp3kkql2szaw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faa5u08nndp3kkql2szaw.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ratpack.io/" rel="noopener noreferrer"&gt;https://ratpack.io/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>groovy</category>
      <category>mock</category>
      <category>testing</category>
    </item>
    <item>
      <title>Mapping with SCHEMA</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Sat, 15 Oct 2022 23:58:43 +0000</pubDate>
      <link>https://dev.to/e240683/mapping-with-schema-502e</link>
      <guid>https://dev.to/e240683/mapping-with-schema-502e</guid>
      <description>&lt;p&gt;Una mala práctica en la configuración de aplicaciones, es usar el &lt;em&gt;owner&lt;/em&gt; del esquema para acceder a la base de datos.&lt;br&gt;
Es recomendable crear una cuenta de usuario y otorgar los permisos necesarios y específicos.&lt;/p&gt;

&lt;p&gt;Pongamos como ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ESQUEMA&lt;/strong&gt;: REGIONALIZACION&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;USUARIO&lt;/strong&gt;: MSPRODUCTOSWOW&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PERMISOS&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Oracle&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; 
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;REGIONALIZACION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LGT_PROD_LOCAL_OFERTA_AUX&lt;/span&gt; 
&lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;MSPRODUCTOSWOW&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;Empleando las anotaciones de Jakarta Persistence, definimos el mapping de nuestra Entity: name/schema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.persistence.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Table&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"LGT_PROD_LOCAL_OFERTA_AUX"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"REGIONALIZACION"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;WOWProduct&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@EmbeddedId&lt;/span&gt; &lt;span class="nc"&gt;WOWProductId&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;porcDctoOferta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="nc"&gt;LocalDateTime&lt;/span&gt; &lt;span class="n"&gt;fecIniVigOferta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="nc"&gt;LocalDateTime&lt;/span&gt; &lt;span class="n"&gt;fecFinVigOferta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;usuCreaProdLocOfe&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="nc"&gt;LocalDateTime&lt;/span&gt; &lt;span class="n"&gt;fecCreaProdLocOfe&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nótese que podemos usar &lt;em&gt;record&lt;/em&gt;, incluso para definir una llave compuesta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Embeddable&lt;/span&gt;
&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;WOWProductId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"COD_GRUPO_CIA"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;codGrupoCia&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"COD_LOCAL"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;codLocal&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"COD_OFERTA"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;codOferta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"COD_PROD"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;codProd&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejecutamos nuestro proyecto basado en #Micronaut:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NWbBl62r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dduj691vh960zfb1et5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NWbBl62r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dduj691vh960zfb1et5x.png" alt="Image description" width="880" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y al listar los productos:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I3w81hR---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xeby3jyiva7vakg9v8em.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I3w81hR---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xeby3jyiva7vakg9v8em.png" alt="Image description" width="452" height="464"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://micronaut-projects.github.io/micronaut-data/latest/guide/#sqlAnnotations"&gt;https://micronaut-projects.github.io/micronaut-data/latest/guide/#sqlAnnotations&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/edgargs/mn-jdbc-schema"&gt;https://github.com/edgargs/mn-jdbc-schema&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>micronaut</category>
      <category>jdbc</category>
    </item>
    <item>
      <title>Validar paquetes de Oracle con Docker (en un pipeline)</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Tue, 30 Aug 2022 14:31:27 +0000</pubDate>
      <link>https://dev.to/e240683/validar-paquetes-de-oracle-con-docker-en-un-pipeline-beh</link>
      <guid>https://dev.to/e240683/validar-paquetes-de-oracle-con-docker-en-un-pipeline-beh</guid>
      <description>&lt;p&gt;La forma correcta de asegurar que los paquetes de nuesta aplicación, no tengan errores durante el Pase a Producción; es compilarlos anticipadamente en un ambiente Pre-Producción (o UAT).&lt;/p&gt;

&lt;p&gt;Pero si lo tenemos que hacer manualmente, existe la posibilidad de obviar algún &lt;em&gt;script&lt;/em&gt; o validación.&lt;/p&gt;

&lt;p&gt;De manera que, automatizar este paso es crucial en nuestra operación de CI/CD.&lt;/p&gt;




&lt;p&gt;Como primer punto, es tener una base de datos inicial. Puede contener solo la estructura de las tablas y con ello reducimos el tamaño del &lt;em&gt;export&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Realizamos el &lt;em&gt;import&lt;/em&gt; en una imagen de &lt;em&gt;Docker&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM docker.io/gvenzl/oracle-xe:11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, ejecutaremos los scripts (DDL y DML). A continuación, compilaremos todos los paquetes. &lt;/p&gt;

&lt;p&gt;De haber paquetes inválidos, el &lt;em&gt;Pipeline&lt;/em&gt; fallará. Esa será la forma de validarlos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8cBGgJtE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wishk4qs522lf6pf7tqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8cBGgJtE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wishk4qs522lf6pf7tqx.png" alt="Image description" width="673" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este es un ejemplo del archivo azure-pipelin.yml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Build Docker image for this app, to be published to Docker Registry&lt;/span&gt;
&lt;span class="na"&gt;pool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;vmImage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ubuntu-latest'&lt;/span&gt;
&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;buildConfiguration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Release'&lt;/span&gt;
&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;git clone https://gitlab.com/edgar.gs/posunificado-docker-oracle11g.git&lt;/span&gt;
    &lt;span class="s"&gt;cd posunificado-docker-oracle11g&lt;/span&gt;
    &lt;span class="s"&gt;git checkout 5a9d701c0492841e734ee08dd1de10f6d652578d&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CopyFiles@2&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;SourceFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;posunificado-docker-oracle11g/DOCKER/init_scripts'&lt;/span&gt;
    &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**'&lt;/span&gt;
    &lt;span class="na"&gt;targetFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fps-app-bd-posunificado/DOCKER/init_scripts'&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ExtractFiles@1&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;archiveFilePatterns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;posunificado-docker-oracle11g/DOCKER/PTOVENTA_V1.7.2.DMP.zip'&lt;/span&gt;
    &lt;span class="na"&gt;destinationFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fps-app-bd-posunificado'&lt;/span&gt;
    &lt;span class="na"&gt;cleanDestinationFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;overwriteExistingFiles&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt; 
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;cd fps-app-bd-posunificado&lt;/span&gt;
    &lt;span class="s"&gt;docker build -f Dockerfile -t ptoventa-build:$BUILD_BUILDID .&lt;/span&gt;
    &lt;span class="s"&gt;docker run --name ptoventadb ptoventa-build:$BUILD_BUILDID&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;docker start ptoventadb&lt;/span&gt;
    &lt;span class="s"&gt;docker cp ptoventadb:/u01/app/oracle/artifacts $(System.DefaultWorkingDirectory)&lt;/span&gt;
    &lt;span class="s"&gt;docker stop ptoventadb&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CopyFiles@2&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**/*.log'&lt;/span&gt;
    &lt;span class="na"&gt;targetFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$(Build.ArtifactStagingDirectory)&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PublishBuildArtifacts@1&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;pathToPublish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$(Build.ArtifactStagingDirectory)&lt;/span&gt;
    &lt;span class="na"&gt;artifactName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MyBuildOutputs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Se puede observar la ejecución en el siguiente video:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/eXm_NThI4Fk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/edgar.gs/posunificado-docker-oracle11g.git"&gt;https://gitlab.com/edgar.gs/posunificado-docker-oracle11g.git&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hub.docker.com/r/gvenzl/oracle-xe"&gt;https://hub.docker.com/r/gvenzl/oracle-xe&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>azure</category>
      <category>devops</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
