some image

Month mayo 2015

Intellij IDEA Maven haciendo refactor en propiedades

Etiquetas: Blog, Programación No comments

A veces en Maven se hace necesaria la labor de colocar dentro del tag <properties>, las versiones de las dependencias que estamos utilizando, esto con el fin de facilitar la mantenibilidad de nuestras dependencias. Para esto en Intellij IDEA, existe un shorcut o método abreviado para hacer esta tarea.

¿Cómo aplicar refactor a las propiedades de las dependencias de Maven en Intellij IDEA?

1. Seleccionar la versión de la dependencia que queremos enviar a una propiedad.

2. Pulsar la combinación de teclas CTRL + ALT + V

3. Colocar el nombre que tendrá la propiedad y después aceptar.

Intellij Idea Refactor

 

Intellij Idea Refactor

 

Usando FreeMarker como generador de Plantillas

Etiquetas: , Blog, Programación No comments

Estos días tuve la necesidad de realizar el envio de emails utilizando plantillas, el dilema es que fue necesario utilizar una estrategía para facilitar el trabajo. Las opciones eran FreeMarker y Velocity. Después de consultar Pros y Contras de ambas librerias, decidí optar por FreeMarker, ya que el proyecto sigue arriba mientras que Velocity “has gone” :( . Bien entonces ahora sí vamos al grano.

1. ¿Qué es FreeMarker?

FreeMarker es en pocas palabras un “Motor de Plantillas”  escrito en lenguaje Java, el cuál nos permite a partir de una Plantilla (Template) y una serie de Parametros (Parameters), obtener el contenido de una plantilla procesada. Esta libreria puede ser descargada de la página oficial o en caso de querer utilizarlo con un gestor de administración de proyectos como Maven, la dependencia es :

    

  org.freemarker
  freemarker
  2.3.20

 

2. Ejemplo

Bien, a continuación coloco un código de ejemplo

package org.codesandtags;

import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.IOException;
import java.io.StringReader;
import java.util.Locale;

/**
 * Clase de ejemplo utilizando FreeMarker para obtener
 * un Template procesado a partir de una cadena de texto
 *
 * Created by codesandtags on 27/05/2015.
 */
public class FreeMarkerExample {

    private Configuration configuration;
    private Template template;

    public FreeMarkerExample(){
        configuration = new Configuration();
        configuration.setDefaultEncoding("UTF-8");
        configuration.setLocale(Locale.US);
    }

    public Configuration getConfiguration() {
        return configuration;
    }

    public Template getTemplate() {
        return template;
    }

    public void setTemplate(Template template) {
        this.template = template;
    }

    public void setContentTemplate(String name, String content){
        try {
            template = new Template(name, new StringReader(content), getConfiguration());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Clase de Prueba

package org.codesandtags;

import freemarker.template.TemplateException;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by codesandtags on 27/05/2015.
 */
public class FreeMarkerExampleTest {

    @Test
    public void generateTemplateTest(){
        FreeMarkerExample example = new FreeMarkerExample();
        StringBuilder content = new StringBuilder("Hello ${user},")
                .append("\nthis is an example using FreeMarker. ")
                .append("\nThe list of names are :  ")
                .append("\n<#list names as name>  ")
                .append("\n  ${name_index + 1}. ${name} ")
                .append("\n  ");

        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("user", "Codes and Tags");
        parameters.put("names", new ArrayList(Arrays.asList("Cocoman", "Juan", "Edwin")));

        try {
            example.setContentTemplate("exampleTemplate", content.toString());
            Writer out = new StringWriter();
            example.getTemplate().process(parameters, out);
            Assert.assertNotNull(out);
            System.out.println(out.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
    }

}

Salida generada una vez se ha procesado la plantilla con sus parámetros

Hello Codes and Tags,
this is an example using FreeMarker. 
The list of names are :  
  1. Cocoman 
  2. Juan 
  3. Edwin 

 

3. Descargar Ejemplo desde GitHub

https://github.com/codesandtags/freemarker-example

Git Logo

GitHub Codes and Tags

4. Referencias

http://freemarker.org/
http://www.vogella.com/tutorials/FreeMarker/article.html
http://www.javabeat.net/freemarker-template-hello-world-example/
http://viralpatel.net/blogs/freemaker-template-hello-world-tutorial/

Validar numero en Java con expresiones regulares

Etiquetas: Blog, Programación No comments

Una de las operaciones más comunes cuando se trabaja con datos, es validar si un dato es numérico o no. Existen diferentes formas de hacerlo, una de ellas muy común es utilizar una expresión regular al tratar de realizar un parseInt, parseLong o parseDouble. Sin embargo cuando no necesitamos crear metodos adicionales en nuestras clases, podemos recurrir rapidamente a nuestros mejores amigos para manejo de cadenas : “Las Expresiones Regulares”.

El ejemplo mostrado a continuación presenta otra alternativa para realizar validaciones de números utilizando expresiones regulares, a partir del método maches de la clase String :).

Código

public class ValidarNumero {

	public static void main(String[] args) {

		ValidarNumero ejemplo = new ValidarNumero();

		// # Realizando validaciones a un numero

		// Numero con un espacio
		System.out.println(ejemplo.validar(" 123456"));
		// Numero con un caracter especial (punto)
		System.out.println(ejemplo.validar("12.3456"));
		// Con un caracter especial (coma)
		System.out.println(ejemplo.validar("10,0001"));
		// Numero valido
		System.out.println(ejemplo.validar("3465756"));
		// Numero con una letra (A)
		System.out.println(ejemplo.validar("10000A"));
		// Cadena vacia
		System.out.println(ejemplo.validar(""));

		// # Eliminando caracteres no correspondientes a un numero

		// Numero con un espacio
		System.out.println(ejemplo.convertir(" 123456"));
		// Numero con un caracter especial (punto)
		System.out.println(ejemplo.convertir("12.3456"));
		// Con un caracter especial (coma)
		System.out.println(ejemplo.convertir("10,0001"));
		// Numero valido
		System.out.println(ejemplo.convertir("3465756"));
		// Numero con una letra (A)
		System.out.println(ejemplo.convertir("10000A"));
		// Cadena vacia
		System.out.println(ejemplo.convertir(""));

	}

	public boolean validar(String cadena) {
		if (cadena.matches("[0-9]*")) {
			return true;
		} else {
			return false;
		}
	}

	public int convertir(String numero) {
		// Se reemplazan todos los caracteres que no correspondan a un numero
		// por espacio
		numero = numero.replaceAll("[^0-9]", "");

		// Si la cadena queda vacia
		if (numero.equals("")) {
			numero = "0";
		}

		return Integer.parseInt(numero);
	}

}

Salida

false
false
false
true
false
true
123456
123456
100001
3465756
10000
0

Utilizando comodines para colecciones y tipos genéricos en Java

Etiquetas: , Blog, Programación No comments

Bien, esta vez mi cápitulo de estudio habla sobre el manejo de los comodines  utilizando los tipos genéricos.

Primero que todo, partiré de la teória que un tipo genérico nos permite disponer de colecciones capaces de almacenar cualquier tipo de de objeto. La famosa <E> (Por ejemplo a veces cuando estamos definiendo un ArrayList y el IDE nos muestra la sugerencia de ArrayList<E>).

Sucede que en el caso de que queramos implementar un método al que no le importe el tipo de dato que queremos mostrar, tendremos un problema, debido a que en el caso de las colecciones ellos por obligación utilizan la definición de un tipo de dato. Ejemplo :

ArrayList<String>()
ArrayList<Integer>()
ArrayList<Double>()
...
HashTable <String>><String>()
HashTable <Integer><String>()

y bueno, ¿Que pasaría si en mi ejemplo quisiera un método que listara los elementos de esas colecciones?... En el caso de que yo defina el tipo de dato que maneja la colección mi método se verá limitado solo a ese tipo de Objetos…

Pero bueno, el punto aquí es el siguiente : Existen 2 formas de hacer que los comodines puedan acceder a cualquier tipo de Objeto, teniendo en cuenta que todas las clases heredan de Object.

1) Se puede utilizar el comodin <?> para los genéricos,  donde en vez de indicar explicitamente el tipo de objeto  a manejar, dejamos que sea Java quien se encarga de hacer el propio casting para convertirlo en un Object.

2) No indicar el genérico. Aunque para aumentar la mantenibilidad y claridad de código siempre es recomendable hacer alusión al tipo de objeto en las colecciones que estemos manejando.

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;

/**
 * Ejemplo de Herencia con tipos Genericos y algunas colecciones Aqui se muestra
 * la magia de los comodines para el recorrido de colecciones
 *
 * @author CodesandTags
 */
public class HerenciaGenericos {

	public static void main(String[] args) {
		// Aqui esta la prueba
		// Lista de nombres
		ArrayList nombres = new ArrayList();
		nombres.add("Clerigo");
		nombres.add("Phicar");
		nombres.add("Dmk");
		nombres.add("TalCosa");
		nombres.add("Urban");
		nombres.add("Radical");

		// Imprimiento
		System.out.println(" [ Nombres ] ");
		imprime(nombres);

		// Lista de numeros
		ArrayList numeros = new ArrayList();
		numeros.add(12);
		numeros.add(6);
		numeros.add(66);
		numeros.add(888);
		numeros.add(777);

		// Imprimiendo
		System.out.println("\n [ Numeros ] ");
		imprime(numeros);

		// Ahora los HashTables
		Hashtable empleados = new Hashtable();
		empleados.put("1111", "Programador");
		empleados.put("9999", "Tester");
		empleados.put("3333", "Director Proyecto");
		empleados.put("5555", "Gerente Tecnologia");
		empleados.put("6666", "Analista Requerimientos");

		System.out.println("\n [ Empleados ] ");
		imprime(empleados);
	}

	/**
	 * Metodo que se encarga de imprimir una lista de objetos sin importar el
	 * tipo de datos almacenados
	 *
	 * @param objetos
	 */
	public static void imprime(ArrayList objetos) {
		for (Object o : objetos) {
			System.out.println("=> " + o);
		}
	}

	/**
	 * Metodo sobrecargado de imprimir pero utilizando un HashTable
	 *
	 * @param objetos
	 */
	public static void imprime(Hashtable objetos) {
		Enumeration keys = objetos.keys();
		while (keys.hasMoreElements()) {
			System.out.println("=> " + objetos.get(keys.nextElement()));
		}
	}

}

Ejemplo de Salida

 

 [ Nombres ] 
=> Clerigo
=> Phicar
=> Dmk
=> TalCosa
=> Urban
=> Radical

 [ Numeros ] 
=> 12
=> 6
=> 66
=> 888
=> 777

 [ Empleados ] 
=> Gerente Tecnologia
=> Director Proyecto
=> Programador
=> Analista Requerimientos
=> Tester

Obtener la media de un arreglo de numeros

Etiquetas: , Blog, Programación No comments

Este ejemplo pretende mostrar la forma de obtener la media de un arreglo de numeros ingresados por teclado. Se decide utilizar un metodo que reciba un arreglo, porque se pude por ejemplo mostrar los numeros procesados y realizar algún tipo de operación.

Codigo

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * Desarrollar un algoritmo que calcule la media de N números ingresados por
 * teclado
 * 
 * @author codesandtags
 * 
 */
public class MediaNumeros {

	public static void main(String[] args) {

		// Objeto para lectura de datos por teclado
		BufferedReader input = new BufferedReader(new InputStreamReader(
				System.in));
		// Variables de control
		int[] numeros = new int[0];
		int cantidad = 0;

		// Control de la excepcion para que no se ingresen datos no numericos
		try {
			// Solicitud de la cantidad e inicializacion del arreglo
			System.out.print("Ingrese cantidad de numeros a procesar : ");
			cantidad = Integer.parseInt(input.readLine());
			numeros = new int[cantidad];

			// Ingreso de los numeros
			for (int i = 0; i < cantidad; i++) {
				System.out.print("Ingrese numero[" + (i + 1) + "] : ");
				numeros[i] = Integer.parseInt(input.readLine());
			}

		} catch (Exception e) {
			System.err
					.println("\nERROR : El valor ingresado no es un numero entero");
		}

		// Instanciacion y envio de los numeros para obtener la media
		MediaNumeros resultado = new MediaNumeros();
		System.out.println("La media de los numeros es : "
				+ resultado.getMedia(numeros));
	}

	/**
	 * Obtiene la media de un arreglo de numeros ingresados
	 * 
	 * @param numeros
	 * @return
	 */
	public float getMedia(int[] numeros) {
		float media = 0f;
		for (int i = 0; i < numeros.length; i++) {
			media += numeros[i];
		}
		System.out.println("Total numeros : " + numeros.length);
		return (media / numeros.length);
	}

}

Salida

Ingrese cantidad de numeros a procesar : 8
Ingrese numero[1] : 564
Ingrese numero[2] : 1
Ingrese numero[3] : 9
Ingrese numero[4] : 0
Ingrese numero[5] : 657
Ingrese numero[6] : 91
Ingrese numero[7] : 35
Ingrese numero[8] : 99
Total numeros : 8
La media de los numeros es : 182.0