Home » julio 2012
JavaMail utilizando TLS

JavaMail utilizando TLS
1. JavaMailutilizando TLS

Ejemplo de enviar correo con JavaMail utilizando TLS.
package com.mkyong.common;
 
import java.util.Properties;
 
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 public class SendMailTLS {
 
 public static void main(String[] args) {
   final String username = "user@gmail.com";
  final String password = "pass";
   Properties props = new Properties();
  props.put("mail.smtp.auth", "true");
  props.put("mail.smtp.starttls.enable", "true");
  props.put("mail.smtp.host", "smtp.gmail.com");
  props.put("mail.smtp.port", "587");
   Session session = Session.getInstance(props,
    new javax.mail.Authenticator() {
  protected PasswordAuthentication getPasswordAuthentication() {
   return new PasswordAuthentication(username, password);
   }
    });
   try {
   Message message = new MimeMessage(session);
  message.setFrom(new InternetAddress("from@gmail.com"));
  message.setRecipients(Message.RecipientType.TO,
    InternetAddress.parse("to@gmail.com"));
  message.setSubject("Subject");
  message.setText("email de prueba");
    Transport.send(message);
    System.out.println("Finalizado");
   } catch (MessagingException e) {
   throw new RuntimeException(e);
  }
 }
}

Diagramas de caso de uso (Use Case)

Diagramas de caso de uso (Use Case)

Casos de Uso (Use Case)

Introducción
El diagrama de casos de uso representa la forma en como un Cliente (Actor) opera con el sistema en desarrollo, además de la forma, tipo y orden en como los elementos interactuan (operaciones o casos de uso).
Un diagrama de casos de uso consta de los siguientes elementos:
  • Actor.
  • Casos de Uso.
  • Relaciones de Uso, Herencia y Comunicación.
Elementos
  • Actor:

    Una definición previa, es que un Actor es un rol que un usuario juega con respecto al sistema. Es importante destacar el uso de la palabra rol, pues con esto se especifica que un Actor no necesariamente representa a una persona en particular, sino más bien la labor que realiza frente al sistema.
    Como ejemplo a la definición anterior, tenemos el caso de un sistema de ventas en que el rol de Vendedor con respecto al sistema puede ser realizado por un Vendedor o bien por el Jefe de Local.
  • Caso de Uso:

    Es una operación/tarea específica que se realiza tras una orden de algún agente externo, sea desde una petición de un actor o bien desde la invocación desde otro caso de uso.
  • Relaciones:
    • Asociación 
      Es el tipo de relación más básica que indica la invocación desde un actor o caso de uso a otra operación (caso de uso). Dicha relación se denota con una flecha simple.
    • Dependencia o Instanciación 
      Es una forma muy particular de relación entre clases, en la cual una clase depende de otra, es decir, se instancia (se crea). Dicha relación se denota con una flecha punteada.
    • Generalización 
      Este tipo de relación es uno de los más utilizados, cumple una doble función dependiendo de su estereotipo, que puede ser de Uso (<>) o de Herencia (<>).
      Este tipo de relación esta orientado exclusivamente para casos de uso (y no para actores).
      extends: Se recomienda utilizar cuando un caso de uso es similar a otro (características).
      uses: Se recomienda utilizar cuando se tiene un conjunto de características que son similares en más de un caso de uso y no se desea mantener copiada la descripción de la característica.
      De lo anterior cabe mencionar que tiene el mismo paradigma en diseño y modelamiento de clases, en donde esta la duda clásica de usar o heredar.
Ejemplo:
Como ejemplo esta el caso de una Máquina Recicladora:
Sistema que controla una máquina de reciclamiento de botellas, tarros y jabas. El sistema debe controlar y/o aceptar:
  • Registrar el número de ítemes ingresados.
  • Imprimir un recibo cuando el usuario lo solicita:
    1. Describe lo depositado
    2. El valor de cada item
    3. Total
  • El usuario/cliente presiona el botón de comienzo
  • Existe un operador que desea saber lo siguiente:
    1. Cuantos ítemes han sido retornados en el día.
    2. Al final de cada día el operador solicita un resumen de todo lo depositado en el día.
  • El operador debe además poder cambiar:
    1. Información asociada a ítemes.
    2. Dar una alarma en el caso de que:
      1. Item se atora.
      2. No hay más papel.
Como una primera aproximación identificamos a los actores que interactuan con el sistema:
Luego, tenemos que un Cliente puede Depositar Itemes y un Operador puede cambiar la información de un Item o bien puede Imprimir un informe:
Además podemos notar que un item puede ser una Botella, un Tarro o una Jaba.
Otro aspecto es la impresión de comprobantes, que puede ser realizada después de depositar algún item por un cliente o bien puede ser realizada a petición de un operador.
Entonces, el diseño completo del diagrama Use Case es:

Formatear una fecha y Obtener un String

Formatear una fecha y Obtener un String
Algo que siempre nos da mucho problema es el trabajo con fechas en java, hoy me encontré con un problema, les dejo la solución que encontré para que la tomen en cuenta si se topan con lo mismo. Se trata de formatear una fecha de forma simple para poder mostrar simplemente el texto mediante programación en java, eliminando la complejidad de los objetos GregorianCalendar o Date, mediante la clase SimpleDateFormat

Ejemplo:
    SimpleDateFormat sdf = new SimpleDateFormat("dd - MM - yyyy");
    Calendar cal = Calendar.getInstance(); // hoy
    System.out.println("Hoy es " + sdf.format(cal.getTime()));

La clase SimpleDateFormat es muy sencilla de utilizar en java. Simplemente al constructor hay que pasarle cómo se deben formatear las fechas. dd es el día, MM es el mes y yyyy es el año. Se puede ver una lista de los posibles valores que admite en la API de SimpleDateFormat.

Una vez inicializada la clase, el método format devuelve un StringBuffer con la fecha debidamente formateada. Se le debe pasar un objeto de tipo Date, que se puede extraer del GregorianCalendar mediante el método getTime()…y ya está este sencilla rutina de programación en java.

Como implementar la Herencia en Java

Como implementar la Herencia en Java

HERENCIA EN JAVA

La herencia es parte integral de Java (y de todos los lenguajes de programación orientados a objetos). Los usuarios de Java siempre utilizan herencia cuando crean sus clases, porque implícitamente cuando se crea cualquier clase en Java, esta hereda de la clase Object.
La Herencia es el mecanismo por el que se crean nuevos objetos definidos en términos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se puede crear la subclase Pato, que es una especialización de Ave.
            class Ave {
        String color;
        }
           class Pato extends Ave {
        int numero_de_patas;
        }


La palabra reservada extends se usa para generar una subclase (especialización) de un objeto. Una Pato es una subclase de Ave. Cualquier cosa que contenga la definición de Ave será copiada a la clase Pato, además, en Pato se pueden definir sus propios métodos y variables de instancia. Se dice que Pato deriva o hereda de Ave.
La herencia sirve para la reutilización de código, otro ejemplo de esto es la clase Automóvil en la cual se pueden definir los métodos más comunes como lo son acelerar, frenar y transportar, sin embargo si se necesita una clase Patrulla que también es un tipo de Automóvil, si no existiera la herencia, entonces se tendrían que definir los métodos acelerar, frenar, transportar y además los métodos particulares de patrulla que serían prender sirena y apagar sirena, en ese sentido el programador estaría trabajando de más, pero como existe la herencia, esto conlleva a la facilidad de aprovechar los métodos ya definidos en Automóvil y poderlos utilizar en la clase Patrulla.
La representación con código del ejemplo anterior es:
class Automovil{
        public void acelerar(){
           System.out.println("el automovil está acelerando");
           }
        public void frenar(){
           System.out.println("el automovil está frenando");
           }
       public void transportar(){
           System.out.println("el automovil está tarnsportando");
           }
    }
class Patrulla extends Automovil{
       public void prenderSirena(){
           System.out.println("Sirena encendida");
           }
       public void apagarSirena(){
           System.out.println("Sirena Apagada");
           }
    }

Control de excepciones en la programación en Java

Control de excepciones

GESTIÓN DE EXCEPCIONES Y ERRORES
A. Introducción

El control de flujo en un programa Java puede hacerse mediante las ya conocidas sentencias estructuradas (if, while, return). Pero Java va mucho más allá, mediante una técnica de programación denominada gestión de excepciones.
Mediante las excepciones se podrá evitar repetir continuamente código, en busca de un posible error, y avisar a otros objetos de una condición anormal de ejecución durante un programa.
Durante este capítulo estudiaremos la gestión de excepciones y errores, sin pretender profundizar demasiado, pero sí fijando la base conceptual de lo que este modo de programación supone.
Mediante la gestión de excepciones se prescindirá de sentencias de control de errores del tipo:
if ( error == true )

  return ERROR;


B. Tipos de excepciones
Existen varios tipos fundamentales de excepciones:
  • Error: Excepciones que indican problemas muy graves, que suelen ser no recuperables y no deben casi nunca ser capturadas.

  • Exception: Excepciones no definitivas, pero que se detectan fuera del tiempo de ejecución.

  • RuntimeException: Excepciones que se dan durante la ejecución del programa.

Todas las excepciones tienen como clase base la clase Throwable, que está incluida en el paquete java.lang, y sus métodos son:
  • Trowable( String mensaje ); Constructor. La cadena es opcional

  • Throwable fillInStackTrace(); Llena la pila de traza de ejecución.

  • String getLocalizedMessage(); Crea una descripción local de este objeto.

  • String getMessage(); Devuelve la cadena de error del objeto.

  • void printStackTrace( PrintStream_o_PrintWriter s ); Imprime este objeto y su traza en el flujo del parámetro s, o en la salida estándar (por defecto).

  • String toString; Devuelve una breve descripción del objeto.
C. Funcionamientoa.) Introducción
Para que el sistema de gestión de excepciones funcione, se ha de trabajar en dos partes de los programas:
  • Definir qué partes de los programas crean una excepción y bajo qué condiciones. Para ello se utilizan las palabras reservadas throw y throws.

  • Comprobar en ciertas partes de los programas si una excepción se ha producido, y actuar en consecuencia. Para ello se utilizan las palabras reservadas try, catch y finally.
b.) Manejo de excepciones: try - catch - finally
Cuando el programador va a ejecutar un trozo de código que pueda provocar una excepción (por ejemplo, una lectura en un fichero), debe incluir este fragmento de código dentro de un bloque try:
try {

  // Código posiblemente problemático

}


Pero lo importante es cómo controlar qué hacer con la posible excepción que se cree. Para ello se utilizan las clausulas catch, en las que se especifica que acción realizar:
try {

  // Código posiblemente problemático

} catch( tipo_de_excepcion e) {

  // Código para solucionar la excepción e

} catch( tipo_de_excepcion_mas_general e) {

  // Código para solucionar la excepción e

}


En el ejemplo se observa que se pueden anidar sentencias catch, pero conviene hacerlo indicando en último lugar las excepciones más generales (es decir, que se encuentren más arriba en el árbol de herencia de excepciones), porque el intérprete Java ejecutará aquel bloque de código catch cuyo parámetro sea del tipo de una excepción lanzada.
Si por ejemplo se intentase capturar primero una excepción Throwable, nunca llegaríamos a gestionar una excepción Runtime, puesto que cualquier clase hija de Runtime es también hija de Throwable, por herencia.
Si no se ha lanzado ninguna excepción el código continúa sin ejecutar ninguna sentencia catch.
Pero, ¿y si quiero realizar una acción común a todas las opciones?. Para insertar fragmentos de código que se ejecuten tras la gestión de las excepciones. Este código se ejecutará tanto si se ha tratado una excepción (catch) como sino. Este tipo de código se inserta en una sentencia finally, que será ejecutada tras el bloque try o catch:

try {

} catch( Exception e ) {

} finally {

  // Se ejecutara tras try o catch

}


c.) Lanzamiento de excepciones: throw - throws
Muchas veces el programador dentro de un determinado método deberá comprobar si alguna condición de excepción se cumple, y si es así lanzarla. Para ello se utilizan las palabras reservadas throw y throws.
Por una parte la excepción se lanza mediante la sentencia throw:
if ( condicion_de_excepcion == true )

  throw new miExcepcion();


Se puede observar que hemos creado un objeto de la clase miExcepcion, puesto que las excepciones son objetos y por tanto deberán ser instanciadas antes de ser lanzadas.
Aquellos métodos que pueden lanzar excepciones, deben cuáles son esas excepciones en su declaración. Para ello se utiliza la sentencia throws:
tipo_devuelto miMetodoLanzador() throws miExcep1, miExcep2 {

  // Codigo capaz de lanzar excepciones miExcep1 y miExcep2

}


Se puede observar que cuando se pueden lanzar en el método más de una excepción se deben indicar en su declaración separadas por comas.
d.) Ejemplo de gestión de excepciones
Ahora que ya sabemos cómo funciona este sistema, conviene ver al menos un pequeño ejemplo, que ilustre al lector en el uso de las excepciones:
// Creo una excepción personalizada

class MiExcepcion extends Exception {

  MiExcepcion(){

    super(); // constructor por defecto de Exception

  }

  MiExcepcion( String cadena ){

    super( cadena ); // constructor param. de Exception

  }

}


// Esta clase lanzará la excepción

class Lanzadora {

  void lanzaSiNegativo( int param ) throws MiExcepcion {

    if ( param < 0 )

      throw new MiExcepcion( "Numero negativo" );

  }

}


class Excepciones {

  public static void main( String[] args ) {

    // Para leer un fichero

    Lanzadora lanza = new Lanzadora();

    FileInputStream entrada = null;

    int leo;

    try {

      entrada = new FileInputStream( "fich.txt" );

      while ( ( leo = entrada.read() ) != -1 )

        lanza.lanzaSiNegativo( leo );

      entrada.close();

      System.out.println( "Todo fue bien" );

    } catch ( MiExcepcion e ){ // Personalizada

      System.out.println( "Excepcion: " + e.getMessage() );

    } catch ( IOException e ){ // Estándar

      System.out.println( "Excepcion: " + e.getMessage() );

    } finally {

      if ( entrada != null )

        try {

          entrada.close(); // Siempre queda cerrado

        } catch ( Exception e ) {

        System.out.println( "Excepcion: " + e.getMessage() );

        }

      System.out.println( "Fichero cerrado." );

    }

  }

}


class Excepciones {

  public static void main( String[] args ) {

    // Para leer un fichero

    FileInputStream entrada = null;

    Lanzadora lanza = new Lanzadora();

    int leo;

    try {

      entrada = new FileInputStream("fich.txt");

      while ( ( leo = entrada.read() ) != -1 )

        lanza.lanzaSiNegativo( leo );

      System.out.println( "Todo fue bien" );

    } catch ( MiExcepcion e ){ // Personalizada

      System.out.println( "Excepcion: " + e.getMessage() );

    } catch ( IOException e ){ // Estándar

      System.out.println( "Excepcion: " + e.getMessage() );

    } finally {

      entrada.close(); // Así el fichero siempre queda cerrado

      System.out.println( "Fichero cerrado" );

    }

  }

}


Este programa lee un fichero (fichero.txt), y lee su contenido en forma de números.
Si alguno de los números leídos es negativo, lanza una excepción MiExcepcion, Además gestiona la excepción IOException, que es una excepción de las que Java incluye y que se lanza si hay algún problema en una operación de entrada/salida.
Ambas excepciones son gestionadas, imprimiendo su contenido (cadena de error) por pantalla.
La salida de este programa, suponiendo un número negativo sería:
Excepcion: Numero negativo
Fichero cerrado

En el caso de que no hubiera ningún número negativo sería:
Todo fue bien
Fichero cerrado

En el caso de que se produjese un error de E/S, al leer el primer número, sería:
Excepcion: java.io.IOException
Fichero cerrado

Errores comunes en programación en Java

Errores comunes en programación en Java

  • Una Clase no está en el directorio correcto
    Este error de sintaxis ocurre si el comando javac no puede encontrar un archivo .java en el directorio esperado. Si una Clase está en el paquete por defecto (no tiene la declaración del package en la primera línea), entonces esta Clase pertenece al directorio actual de trabajo o al directorio donde apunta el flag sourcepath del javac. Si una Clase está a un paquete, entonces pertenece a un subdirectorio debajo del directorio actual de trabajo o a un subdirectorio debajo del directorio donde apunta el flan sourcepath del javac. Por ejemplo, si existe una Clase llamada com.hello.HelloWorld entonces su nombre es HelloWorld y su paquete es com.hello. Si el flan sourcepath está configurada a c:src, entonces el archivo HelloWorld.java debe estar ubicado en el subdirectorio: c:srccomhello.
  • El nombre de la Clase pública no coincide con el nombre del archivo
    Cada archivo .java puede contener sólo una Clase pública. El nombre de esa Clase pública debe coincidir exactamente con el nombre del archivo antes de la extensión .java, respetando incluso las mayúsculas y minúsculas. Por ejemplo, una Clase pública llamada MyClass debe estar en un archivo MyClass.java y no en myclass.java. Este es un error de sintaxis.

  • Error en mayúsculas y minúsculas. Java es un lenguaje case sensitive, esto es que debemos respetar las mayúsculas y minúsculas. (miVar no es igual a mivar). Si hacemos referencia a un identificador que no está bien escrito entonces obtendremos un error de sintaxis.

    • Usando equals contra la asignacion
    • En Java este error puede ser incluso un error de lógica o sintaxis. Para comparar 2 referencias para igualarlas se usa el operador == (el operador de igualdad). Para asignar el valor de la derecha a la variable de la izquierda se usa el operador = (operador de asignación). Los programadores novatos a veces escriben: if (miValor = valorEsperado) Este código intenta evaluar el valor Esperado como un valor booleano en lugar de intentar la evaluación de igualdad entre mi Valor y valorEsperado. Si valorEsperado es del tipo booleano, entonces el código tendrá un error de lógica y probará si el valor Esperado es verdadero o falso. Si valorEsperado no es del tipo booleano, entonces el código lanzará un error de compilación debido a que la estructura if requiere un valor booleano que sea retornado de la comparación (miValor = valorEsperado), pero en Java el operador = siempre retorna el valor de la derecha.
  • Olvidar que los índices en Java empiezan en 0.
    Los índices de los arreglos de Java y las listas empiezan en 0, myArray[0], o myList.get(0). Asegurarse que su loop for no cause errores por este motivo. Si hacemos más loops de los que son posibles, entonces obtendremos el error: ArrayIndexOutBounds exception. Si hacemos menos loops de los requeridos, entonces tendremos un error de lógica.

  • NullPointerException
    El NullPointerException, la maldición de los programadores en Java. Los NullPointerExceptions son errores de lógica causados cuando un programa intenta acceder a métodos o atributos en una referencia que está nula. Si nuestro objeto no ha sido inicializado o ha sido establecido a null con el operador =, entonces la llamada el método o el acceso a uno de sus atributos no es válido.

Entradas populares