jueves, 30 de junio de 2011

Parametros de ordenamiento en listas Parcialmente ordenadas en displayTag

 A veces necitamos que no sea displaytag lo que ordene y pagine la colección (para no tener toda la colección en memoria) y manejar el ordenamiento nosotros mismo.

 displaytag ofrece un mecanismo por el cual uno desde el action de struts puede obtener datos necesarios para la paginación y ordenamiento como son el nombre de la columna y el numero de pagina.

  Tales parámetros se pueden obtener del siguiente modo

para saber el nombre (nombre definido en la propiedad sortName="" de la tabla de displaytag)
request.getParameter(paramEncoder.encodeParameterName(TableTagParameters.PARAMETER_SORT))   

y este es para saber el orden 1 o 2 (ASC o DESC)
request.getParameter(paramEncoder.encodeParameterName(TableTagParameters.PARAMETER_ORDER))

Es importante tener en cuenta que cuando se invoca por primera, no va a tener un valor, va a ser vacío,
para evitar eso se puede asignar un valor por defecto utilizando el método defaultIfEmpty de la clase org.apache.commons.lang.StringUtils

StringUtils.defaultIfEmpty(request.getParameter(paramEncoder.encodeParameterName(TableTagParameters.PARAMETER_ORDER)),"1");
 y en la primera vez que va a estar vacío se le asignara el "1".

viernes, 6 de mayo de 2011

Manejando fechas con Calendar

A veces necesitamos para nuestro sistema trabajar con fechas, y puede que, para un proceso determinado se necesite trabajar con por ejemplo los 12 meses anteriores a la fecha actual.

En este ejemplo se manejan fecha con Calendar; Calendar de java maneja fechas su instancia no se crea con new sino que se obtiene con getInstance()

-- code --
import java.text.SimpleDateFormat;
import java.util.Calendar;


public class TimePOC {
    public static void main (String[] args){
       
    Integer countMonth, month, year;
       
    for (int i= 0; i<=11; ++i){   
        countMonth = new Integer(i);       
        Calendar calendar = Calendar.getInstance();
        /* Rest the specific month. in order to obtain older data.*/
        calendar.add(Calendar.MONTH, ((-1) * countMonth));
       
        month = Integer.valueOf(new SimpleDateFormat("MM").format(calendar.getTime()));
        year = Integer.valueOf(new SimpleDateFormat("yyyy").format(calendar.getTime()));
        System.out.println("Month: "+month+"Year: "+year);
    }
    }
   
}

miércoles, 12 de enero de 2011

jar -xvf jar -uvf | como extraer un archivo de un archivo.jar


Hola los comandos que hoy les voy a presentar son útiles para cuando tenemos algun archivo que querramos inspeccionar o modicar y este este empaquetado dentro de un archivo .jar 

Desde la consola bash podemos extraer el archivo en cuestion, luego inspeccionarlo o modificarlo y volverlo a empaquetar, debajo estan los comando para hacer eso:
Para extraer un archivo de un archive .jar desde una consola bash
1)       jar –xvf MyFile.jar FileToExtract
      por ej:

Una vez afuera generalmente es donde el archivo se lo consulta o se lo modifica y luego se lo vuelve a poner
en el .jar de donde salio.
Para volver a poner el archive en el .jar

       2) jar -uvf MyFile.jar FileToExtract

Dejo un poco mas de info sobre la Java archive tool:

Saludos,
Nacho.-

martes, 28 de diciembre de 2010

Java System.getProperty(String key) System.SetProperty(String key, String value)

Muchas veces resulta útil poder enviar información desde afuera de la aplicación, como por ejemplo en los scripts que se hacen para levantar las aplicaciones, Java nos permite enviar valores que la aplicación puede recuperar y utilizar según sea el caso, estas son propiedades de la forma clave=valor del tipo String.
 se pueden definir en dos lugares diferentes, el primero es donde se llama a Java cuando se levanta la aplicación agregando -D
Por Ej.:
java -Dlogfile="\home\tomcat\log" nombreDelaClaseMain en cuyo caso se le envía a la VM como argumento una propiedad del tipo String llamada "logfile" y cuyo valor es otro String "\home\tomcat\log".

El otro lugar en que se puede definir estas propiedades es dentro del programa, invocando al método estático setProperty de la clase System,
System.setProperty("propiedad","valorDeLaPropiedad");

 Acá hay un ejemplo de cómo se definen y se  recuperan esas propiedades:

public class SystemPropertiesTest {

    public static void main(String[] args) {
      
       //getting the value setted in the jvm launch
        String value = System.getProperty("key");
        System.out.println(value);

        System.out.println("Setting system property in the class : key + value");
        System.setProperty("key", "valueTwo");
        value = System.getProperty("key");
        System.out.println(value);
    }
}

La llamada desde línea de comando sería la siguiente



En este link http://download.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html  hay información sobre las opciones del aplication launcher de java (dentro de ellas esta las que vimos en este post)

Saludos y espero que les haya sido de utilidad
Nacho.-

lunes, 20 de diciembre de 2010

Crear y borrar Sinónimos en tablas de base de datos Oracle - Create and Drop SYNONYM in oracle data base

Si queremos acceder a una tabla pero sin referenciar a su nombre ( schema.nombre de la tabla) lo que debemos hacer es crear un Sinonimo, con el cual haremos referencias a dicha tabla.

La sintaxis para hacer eso es la siguiente:
CREATE PUBLIC SYNONYM [NombredelSinónimo] FOR [schema].[nombreDeLaTabla]

Al no ser una operacion transaccional, esta no requiere commit

Ej:
CREATE PUBLIC SYNONYM autos FOR ORACLE.MODELOSLATAM;

Como vemos en este ejemplo a la tabla ORACLE.MODELOSLATAM. se le creo un sinonimo, con el cual van a poder acceder (finalmente a la tabla ORACLE.MODELOSLATAM)

Ahora bien, si por el contrario, lo que necesitamos es borrar el sinónimo, todo lo que deberemos hacer es un DROP del sinonimo de dicha tabla.

La sintaxis es:

DROP PUBLIC SYNONYM [NombredelSinonimo] ;

Ej:
DROP PUBLIC SYNONYM autos;

viernes, 17 de diciembre de 2010

Arreglo en Java de los nombres de los pasados 12 meses, en formato MMM-AA

Buenas a todos, debajo les dejo un algoritmo que está hecho en base a uno que hizo un compañero de trabajo, devuelve un arreglo de Strings de los pasados 12 meses respecto del actual (el cual no está incluido) en formato MMM-AA.

[Nov-10,Oct-10...]

Me pareció interesante el manejo del offset ya que para la correspondencia de los meses con sus respectivos nombres, los índices deben estar dentro de los límites del arreglo a fin de que el código funcione bien y evitar un java.lang.ArrayIndexOutOfBoundsException.
Sin más preámbulos acá esta el código java:
/**
     *This method returns an array with the names of the past 12 months prior to
     *the current month, MMM-YY format.
     *@author nachojava
     */
    public String[] headers() {
        String[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
        String[] headers = { "", "", "", "", "", "", "", "", "", "", "", "" };
        int yearOffset = 2000;
        Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR) - yearOffset;
        int previousMonths = c.get(Calendar.MONTH) - 1;
        int monthOffset = 12;

        for (int index = 0; index <= 11; index++) {
            if (year < 10) {               
                headers[index] = months[previousMonths] + "-" + "0" + year;
            } else {               
                headers[index] = months[previousMonths] + "-" + year;
            }
            previousMonths--;

            if (previousMonths < 0) {
                previousMonths = previousMonths + monthOffset;
                year -= 1;
            }
        }
        return headers;
    }

Espero les haya interesado, saludos!
Nacho.-

lunes, 14 de junio de 2010

javax.net.ssl.SSLHandshakeException - Instalar certificados en la Maquina Virtual Java

Tuve este inconveniente con la aplicacion en la que trabajo, este es parte del trace y debajo esta la solucion:

AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target


Eventualmente cuando queremos acceder a un servicio web atraves de nuestra aplicacion Java, necesitemos instalar un certificado a nuestra maquina virtual, para ello primero necesitaremos bajar dicho certificado en nuestra pc y luego instalarlo en la JVM


Para guardar el el certificado en la pc

Acceder a traves de un IE al wsdl del web services, una vez abierto ir a
file-> properties -> General tab -> certificates ->details tab ->copy to file ->aparece un wizard y luego presionar next-> ahi seleccionar el formato DER encoded binary -> ponerle algun nombre significativo al certificado y luego finish

una vez que tengo el certificado en la pc, ahora que hago?
Yo luego de guardarlo en la pc, copie los certificados a un directorio cercano al root
una cosa asi c:\directorio

Luego de eso procederemos a instalar el certificado con el Keytool en el cacerts

Aqui esta el comando ejemplo para instalar el certificado

C:\Program Files\Java\jre6\lib\security>keytool -import -alias webc -file "C:\certificates\webc.cer"
-keystore "C:\Program Files\Java\jre6\lib\security\cacerts"

donde webc es el nombre significativo de este ejemplo pero puede ser el que cada uno quiera y webc.cer es el certificado que bajamos con el wsdl

una vez que le damos enter a ese comando se nos va a requerir la password del keystore, la cual por defecto es changeit

Enter keystore password: changeit
Owner: CN=ebosi.vzbi.com, OU=VBP Cert, O=Verizon Business, L=Boston, ST=MA, C=US
Issuer: CN=VBP Certificate Authority, OU=VBP CA, O=Verizon Business, L=Boston, ST=MA, C=US
Serial number: 49
Valid from: Mon Feb 22 17:03:19 GMT-03:00 2010 until: Tue May 22 17:03:19 GMT-03:00 2018
Certificate fingerprints:
MD5: CC:0B:73:44:67:74:85:06:F2:82:57:D9:BA:53:A1:C4
SHA1: A2:3E:2C:E9:EB:A8:71:14:2C:4E:D9:1D:7B:06:6B:DF:54:29:8F:F6
Trust this certificate? [no]: yes
Certificate was added to keystore

Espero que les haya servido, hasta la proxima!