Librerías

Joko Utils

Introducción

Es una librería de Java que contiene utilidades varias de modo a facilitar funcionalidades comúnmente usadas a la hora de trabajar sobre el Backend de un proyecto, contiene funcionalidades relacionadas a:

  • Archivos Excel
  • Archivos CSV
  • Archivos PDF
  • Trabajo con el tipo DateTime
  • Encoding de archivos
  • Trabajo con DTOs (Data Transfer Objects)
  • Trabajo con distancias
  • Encriptado y Desencriptado
  • Generar UUIDs (Universally Unique IDentifier)
  • Formateo de números
  • Trabajo con direcciones IP
  • Trabajo con Getters y Setters dinámicos

Repositorio: https://github.com/jokoframework/joko-utils

Versiones: https://github.com/jokoframework/joko-utils/releases

Javadoc: https://jokoframework.github.io/joko-utils




Ejemplos

CSV (Comma Seperated Values) Utils

Contiene utilidades para trabajar con el formato CSV.

Ejemplo del método convertToCsv:

El metodo transforma una lista de objetos serializables a un texto en formato CSV, devolviendo el resultado como un byte stream.

Inputs:

  • List<?> que tendrá objetos de una única clase y que tenga la propiedad de ser serializable.
  • List<String> donde cada elemento es ambos la cabecera de una columna del texto CSV así como el nombre del atributo del objeto que ira en las celdas de la columna.
  • La clase de los objetos de la List<?> pasada.

Para el ejemplo usaremos la siguiente clase para nuestra lista de objetos, haciendo que sea serializable así como definiendo los Getters para usar los atributos:

public class UserData implements java.io.Serializable {
    private String name = "NULL";
    private String lastName = "NULL";
    private Integer id = 0;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
}

Generamos los inputs, llamamos al método y escribimos el resultado en un archivo, para utilizar el código de ejemplo debe crear el archivo que contendrá el resultado (Sino dará error) y rellenar el campo “DIRECCION_DEL_ARCHIVO” con la dirección de su archivo:

// Generamos datos del ejemplo
user1.setName("Miguel");
user1.setLastName("Leugim");
user1.setId(12345);

UserData user2 = new UserData();
user2.setName("Carlos");
user2.setLastName("Solrac");
user2.setId(77777);

UserData user3 = new UserData();
user3.setName("Hector");
user3.setLastName("Rotceh");
user3.setId(41569);

List<?> object_list = Arrays.asList(user1, user2, user3);
List<String> header_list = Arrays.asList("Name", "LastName", "ID");

// Llamamos al método y guardamos el archivo CSV
byte [] resultado = CsvUtils.convertToCsv(object_list, header_list, UserData.class);
FileUtils.writeByteArrayToFile(new File("DIRECCION_DEL_ARCHIVO"), resultado);

El archivo generado por este ejemplo:

Name,LastName,ID
"Miguel","Leugim","12345"
"Carlos","Solrac","77777"
"Hector","Rotceh","41569"


Excel Utils

Contiene utilidades para trabajar con archivos Excel.

Ejemplo del método generateExcel

El método utiliza los datos pasados para crear un archivo Excel en el directorio especificado con los datos especificados.

Inputs:

  • Table<Integer, Integer, Object> donde los Integer especifican la celda del archivo Excel y el Object contiene el dato a escribir en la celda (Utiliza la cabecera de la columna para saber que atributo leer del Object).
  • List<String> que contiene las cabeceras de la tabla.
  • String que contiene el nombre del archivo incluyendo la ruta a este (/home/user/mi_excel.xls), el archivo puede o no existir a la hora de correr el método.

Generamos los tres inputs para luego llamar al método que creara el archivo resultante, para utilizar el ejemplo debe modificar el campo “DIRECCION_DEL_ARCHIVO” con la dirección de su archivo (Ej: /home/usuario/Desktop/mi_excel.xls):

// Generamos datos para el ejemplo
final String fileName = "DIRECCION_DEL_ARCHIVO";

List<String> header = Arrays.asList("Name", "LastName", "Email", "Cellphone");

Table<Integer, Integer, Object> data = HashBasedTable.create();
for (int i = 0; i < 10; i++) {
    data.put(i, 0, "Joko " + i);
    data.put(i, 1, "Utils " + i);
    data.put(i, 2, "jokoutils" + i + "@gmail.com");
    data.put(i, 3, 123456*i);
}

// Creamos el archivo Excel
ExcelUtils excelGenerator = new ExcelUtils();
excelGenerator.generateExcel(data, header, fileName);

Vista previa del archivo generado por este ejemplo:

../../_images/generateExcel_img1.png


PDF Utils

Contiene utilidades para trabajar con archivos PDF

Ejemplo del método pdfGenerator

El método utiliza los datos pasados para crear un archivo PDF en el directorio especificado con una tabla conteniendo los datos especificados y agregando una firma al final con datos varios incluyendo el nombre de usuario especificado.

Inputs:

  • List<List> con los datos a escribir en la tabla del PDF.
  • Un String que contiene el nombre del archivo incluyendo la ruta a este (/home/user/mi_pdf.pdf), el archivo puede o no existir a la hora de correr el método, si se provee “Null” se creara en el directorio raíz del proyecto.
  • Un String con un nombre de usuario que sera incluido en la firma al final del PDF.

Generamos los tres inputs para luego llamar al método que escribirá el archivo resultante, para utilizar el código de ejemplo debe modificar el campo “DIRECCION_DEL_ARCHIVO” con la dirección de su archivo final (Ej: /home/usuario/Desktop/mi_excel.xls) al igual que el campo “NOMBRE_DE_USUARIO” con un nombre con el cual firmar el PDF al final:

// Generamos datos de prueba
List<String> cabeceras = Arrays.asList("Nombre Comun", "Nombre Cientifico");
List<String> L1 = Arrays.asList("Perro", "Canis Lupus Familiaris");
List<String> L2 = Arrays.asList("Gato", "Felis Silvestris Catus");
List<String> L3 = Arrays.asList("Conejo", "Oryctolagus Cuniculus");
List<List> data = Arrays.asList(cabeceras, L1, L2, L3);

final String fileName = "DIRECCION_DEL_ARCHIVO";

String user = "NOMBRE_DEL_USUARIO";

// Creamos el PDF
File resultado = PdfGenerator.fromList(data, fileName, user);

Vista previa del PDF generado por este ejemplo:

../../_images/pdfGenerator_img1.png




Joko Security

Introducción

Es una extensión de spring-security que provee la capacidad de realizar autenticación y autorización por medio de JSON Web Tokens (JWT). Permite trabajar con tokens de actualización (Refresh Token) y de acceso (Access Token), se puede utilizar de dos formas:

  • Como un componente separado actuando de emisor de tokens
  • Incluido en una aplicación web como una librería

Repositorio: https://github.com/jokoframework/security

Versiones: https://github.com/jokoframework/security/releases

Javadoc: https://jokoframework.github.io/security




Conceptos de Token

Un token es un permiso particular que garantiza al poseedor acceso a ciertos recursos. Los tokens son firmados por joko-security con una clave secreta, por lo tanto no pueden ser alterados. Esto permite a Joko-security realizar la validación en memoria de los tokens. Por ejemplo: un token extemporáneo se rechaza sin mayor chequeo.

Realizar las validaciones en memoria sin tener que tocar la base de datos permite a los sistemas que utilizan joko-security escalar con mayor rapidez al ser en gran medida stateless.

Los tokens en Joko siguen el standard JWT (JSON Web Tokens) .

Tipos de Token

Existen dos tipos de token:

Refresh Token

Cuando un usuario se autentica al sistema recibe un refresh token. Este token permite al usuario acceder al sistema por un tiempo prolongado pero con pocos permisos de acceso. #### Un refresh token tiene información necesaria para obtener un nuevo access token. #### Un access token sirve para realizar operaciones.

Dependiendo del security profile el sistema devolverá un refresh token con mayor o menor tiempo de vida. Por ejemplo si el usuario accede desde una aplicación web se podría dar un token de una semana, y si accede desde la web en términos de horas. Si el usuario no utiliza la aplicación por 1 (una) semana, entonces necesitará realizar un nuevo login (esto es aceptable desde el punto de vista UX). Los refresh token son especialmente útiles para las aplicaciones móviles en las cuales es molesto pedir el usuario en cada momento la autenticación.

Guardar el token de refresh de manera segura

En el caso de una aplicación móvil se tendría que guardar en el key store, y en el caso de una aplicación Web en los :term:cookies (NO guardarlos en WEB storage)

Access Token

Permite al usuario realizar todas las operaciones que su perfil permita.

Un token de acceso tiene un tiempo de vida corto, y la aplicación tendrá que renovar el token de acceso antes de que este fenezca. Esto crea la sensación al usuario de estar siempre conectado, mientras que también brinda un mayor nivel de seguridad.

Para mayor seguridad el token de acceso se debería de sostener solo en memoria.