/ hybris

impex - acceder y reemplazar columnas

Como leer y reemplazar valores en una columna para todas las filas en un impex

En ocasiones, es necesario recurrir a la fuerza bruta, o simplemente es necesario ajustar valores corruptos en un archivo impex, en este ejemplo, veremos como concatenar un UUID a cada fila para la columna de uid

Impex original:

INSERT_UPDATE Customer;uid[unique=true];name;
;"yay.sample.com";"carlitos";

Utilizar bean shell para acceder a cada elemento con #%, usaremos beforeEach: para indicar (como su nombre lo sugiere) que interceptaremos previo a cada línea, esto nos permitirá reemplazar el valor de la columna UUID con nuestro valor generado

#% import java.util.UUID

INSERT_UPDATE Customer;uid[unique=true];name;

"#% beforeEach:
    // generar un unique identifier
	String uid = UUID.randomUUID().toString();
    
    // formateo del nuevo valor
    String valueWithUid = line.get(Integer.valueOf(2)) + '-' + uid;
    
    // reemplazar el valor
    line.put(Integer.valueOf(2), valueWithUid);
";

;"yay.sample.com";"carlitos";

Como se puede observar, hay varias variables que son inyectadas en el contexto de la línea:

  • line - contiene la colección con los elementos de la fila, al acceder a line.get(index), accedemos a la columna, la columna 0 siempre está vacía ya que hybris, al hacer el split, lo hace por ; y quedaría algo así:

(primer posición);"yay.sample.com"(segunda posición);"carlitos"(tercer posición)

Hay otras variables/palabras-reservadas mágicas para tratar las líneas como:

  • Registry - Registro de beans de spring, por ejemplo: Registry.getApplicationContext().getBean(""yourService"")
  • impex - el cual de hecho es una instancia de ImpexImportReader, que provee métodos como discardNextLine que podrían ser grandes hacks :D

yendo más lejos

Si el beanshell no es lo tuyo y no te gusta usar ; o valores tipados.. Bueno, ciertamente no sé que estás haciendo trabajando con hybris :v PERO Puedes utilizar el no-tan-bello-como-scala groovy! El uso sería similar:

#%groovy% beforeEach:

Y recuerda verificar que la property impex.legacy.scripting se encuentre en false para habilitar el uso de groovy (supongo que lo viejo era beanshell, con hybris no se sabe realmente xD)

conclusión

hybris provee muchas formas para manipular la información de un impex, esta en particular, cuando es un poco intrusiva por afectar directamente un elemento que es diseñado pensando en transacciones simples con la información, evita la necesidad introducir artefactos como Impex Translator, también puede ayudar como solución rápida para un hotfolder

Nota: Sólo recuerda documentar todo lo que hagas, porque hacks como estos no son nada intuitivos y puedes hacerle la vida imposible a tus compañeritos