Pasando variables a métodos:

Los métodos pueden ser declarados para tomar primitivas y/o referencias a objetos. Necesitamos saber como (o si) la variable del que llama al método va a ser afectada por el método. La diferencia entre una referencia a un objeto y una variable primitiva cuando es pasada a un método es grande e importante.

  • Pasando variables de referencia a objetos:
    Cuando pasamos una variable de tipo objeto a un método, debemos saber que estamos pasando la referencia al objeto y no el objeto en si mismo. Recordemos que las variables de referencias contienen un patrón de bits que representa una manera de encontrar a un objeto en memoria (en el Heap mas precisamente). Mas importante aun es que no pasamos la variable de referencia actual, sino una copia de la variable de referencia.
    En otras palabras, el que invoca y el método ahora tienen idénticas copias de la referencia, y los dos se refieren exactamente al mismo (no una copia) objeto en el Heap.
  • Java usa la semántica de pasaje por valor?
    Si java pasa objetos pasando la referencia, esto significa que java usa pasaje por referencia? No exactamente, a pesar de esto, seguido van a escuchar que lo hace. Java realmente realiza pasaje por valor para todas las variable corriendo sobre la misma Virtual Machine. Pasaje por valor significa pasaje por el valor de la variable. Y esto se traduce a pasaje por copia de la variable.
    No hay diferencia si estamos pasando variables primitivas o de referencia, siempre estamos pasando una copia de los bits de la variable.
    Y para la referencia a objetos pasamos una copia de los bits que representan la forma de encontrar a un objeto. Pero estas referencias iguales apuntan al mismo objeto, y si el método modifica al objeto, el que invoco al método vera el objeto cambiado.
    Recordar: El método no puede cambiar la variable del que realizo la invocación. Es decir, que el método no puede re-asignar la variable de referencia que pertenece al que invoco al método para que se refiera a otro objeto o a null.
  • Pasando variables de tipo primitivas:
    Se pasa copiando los bits que representan al valor que contiene la variable.

Declaración, construcción e inicialización de Arrays:

Los arrays en java son objetos que guardan múltiples variables del mismo tipo. Pueden contener tanto primitivas como referencias a objetos, pero el array en si siempre va a ser un objeto en el Heap, aunque haya sido declarado para contener primitivas.

  • Declarando Arrays

    • De primitivas: int[] keys;
    • De referencias a objetos: Thread[] threads;
      Es ilegal si ponemos el tamaño en la declaración: int[5] scores; //No compila
  • Construyendo Arrays
    Significa crear objetos de tipo Array en el Heap. Para crear este objeto Java debe saber cuanto espacio reservar en el Heap, eso debemos especificar el tamaño del array a la hora de crearlo. El tamaño es la cantidad de elementos que el array podría contener.
  • Construyendo arrays de una dimension:
    int[] testscores;
    testscores = new int[4];
    El codigo anterior pone un nuevo objeto en el heap (un objeto tipo array conteniendo 4 elementos) donde cada elemento contiene un int con el valor por defecto (cero en este caso).

    (Copiar figura pag 211)

    Ej: un array de referencia a objeto: Thread[] t=new Thread[5];
    Hay que tener en cuenta que a pesar de que pueda parecer que se esta llamando al constructor de la clase Thread, esto no pasa. hasta aca no se ha creado ninguna instancia de Thread.

  • Construyendo arrays multidimensionales:
    Son solo arrays de arrays.
    int [][] myArray= new int[3][];
    Hay que notar que el codigo anterior es legal ya que la JVM necesita saber solo el tamaño del objeto asignado a la variable myArray.

    (Copiar figura pag 213)

  • Inicializando un array:
    Significa poner cosas dentro del array.
    Animal[] pets= new Animal[3];
    pets[0]=new Animal();
    pets[1]=new Animal();
    pets[2]=new Animal();
  • Declarando, construyendo e inicializando en una solo linea:
    Ej: int[] dots={2,4,8}; donde el tamaño del array se obtiene por la cantidad de elementos separados por coma.
    Ej: Dog[] myDogs={new Dog(“1″),new Dog(“2″)};
    Ej: int[][] scores= {{1,2},{3,4},{5,6,7,8}};

Los siguiente son conceptos que se iran refinando con mi entendimiento en el tema:
SSOTokenManager extiende de ValveBase.. es decir que ejecuta su metodo invoke cada vez que se hace un request.. Y como su documentacion dice intercepta todos los request en busca de la presencia de un SSOToken domain cookie..
Si el usuario se encuentra logueado (EL principal esta seteado) y la cookie no existe, crea una para el resto de la session.

SSOAutoLogin es un autenticador de tipo form que intercepta los request y busca la presencia de un SSOTOken domain cookie. Si existe la cookie se procesa y el pricipal es generado resultando en un Autologin. SSOAutoLogin Tambien exitiende de ValveBase

Si SSOAutologin no encuentra la cookie entonces se procede al metodo de autenticacion normal. Llevada acabo por la clase UsernameAndPasswordLoginModule que exitiende de UsernamePasswordLoginModule. Y esta es la encargada de soportar la autenticacion mediante username y password.

Esto esta definido en el web-inf de la aplicacion web en el archivo context.xml

Vamos a ver el flujo normal de las Valves en el camino del primer request a nuestra aplicacion de prueba:

1) SSOFederationRouter:

  • Levanta la lista de partners  (usa un metodo llamado lookupPartners(request))
    • Este metodo agarra el nombre del server que se encuentra en el request y el puerto y busca la lista de partners en /federate/partners la cual parsea a continuacion, ya que este devuelve el XML de partners que tiene todos los partners  que estan en el archivo de configuracion llamado: server.cfg.xml dentro del federation-server.sar/conf/. Solamente trae los partners, es decir los distintos federation server que hay configurados. por lo tanto se ven de la forma: http://node1.jboss.com:8443/federate y http://node1.jboss.org:8443/federate
  • Busca una variable dentro del request llamada referer y luego si la encuentra … TODO
  • Continua con la cadena de Valves

2) SSOAutoLogOut

  • Busca la session de SSOSession y si no encuentra ninguna crea un objeto SSOSession Nuevo (metodo SSOSession.getSSOSession())
  • Luego con la clase auxiliar SSOUtil va a buscar un token SSO en el request. Este token lo busca en las cookies (metodo SSOUtil.getSSOToken())
  • Si no encuentra el token pasa al siguiente valve en la cadena
  • Si encuentra el token pone en true la flag llamada ssoCookieFound y continua la ejecucion en la siguiente cadena

3) SSOTokenManager

  • Va a buscar el token con la clase SSOUtil.
  • Va a buscar la cookie con Tool.isCookieFound()
  • Va a buscar si estamos en el medio del proceso de LogOut mediante la busqueda de un cookie llamada LOGOUT_TOKEN
  • Va a buscar una SSOSession y si no la encuentra crea una nueva
  • Pregunta si el usuario esta loggeado y la cookie no se ha procesado para realizar el login automatico y setea un flag para que no se realicen autologins
  • Si la cookie no se encuentra le pone un null a SSOSession.setTurOff
  • Continua con el siguiente valve en la ejecucion a pesar de tener codigo todavia para ejecutar.

4) SSOAutoLogin

  • Va a buscar una session y si no la encuentra crea una nueva SSOSession
  • BUsco en la session que tengo tiene en la propiedad getTurnOff null tengo que realizar SSO (performSSO=true)
  • Si performSSO llamamos al metodo performSSO(request,response)
    • Este metodo va y busca un token llamado SSO_SECURE_TOKEN
    • Si encuentra este token lo valida y setea el flag de que encontro la cookie
    • en caso de no ser valido fueza el logout
    • Si la cookie se encontro el flag fue seteado en true
      • Setea los atrivbutos SSO_USERNAME con el usuario obtenido del Principal igualmente con el SSO_PASSWORD
      • Ejecuta el autologin (metodo ssoLogin(request,response,config))
      • Si este metodo devuelve true, setea el principal en la SSOSession
    • Si la cookie no se encontro devuelve false
  • Llamamos a la siguiente Valve en la cadena, si se realizo el autologin solamente va a pasar al siguiente????????????????
  • Sino se realizo el SSOPerformed:
    • Como no se ejecuto el SSO ejecutar authentication mediante FORM

Una vez llegado al final de la ejecucion del Valve numero 4 en este caso SSOAutoLogin la cadena vuelve por el Valve numero 3 llamado SSOTokenManager a ejecutar el codigo que sigue a continuacion:

3) SSOTokenManager:

  • Trata de obtener el principal, si lo encuentra pregunta si no se encontro la cookie, de cumplirse que tenemos un principal y no la cookie
    • Obtiene del dominio y creo que genera una cookie o manda un mensaje con saml para uqe se genere
  • Si el principal es null , verifica si existe la cookie borra/limpia el token ya que no deberia existir

2) SSOAutoLogout: no hace nada ya habia terminado de ejecutar todo su codigo

1) SSOFederationRouter: no hace nada

Este recorrido en el request inicial lo va a hacer 4 veces ya que la pagina del test tiene 3 imagenes (es decir el 1 por el archivo html y 3 por las imagenes)

Los Valves tiene memoria por session de usuario, por lo tanto en el SSOFederationRouter no tienen que ir a buscar los partners todas las veces.

Ahora vamos a ver el request cuando nos authenticamos por primera vez a la aplicacion web, la idea es ver donde se crea el principal (en que request) y cuando afecta al flujo de la ejecucion de los Valves:

1) SSOFederationRouter:

  • ahora si encuentra la variable Referer que indica la pagina de donde venimos: en este caso /secure/index.jsp
  • Esta es la parte donde averigua  si de donde vengo estoy en un miembro de la federacion
  • Como este es distinto de null, arma un objeto URL con el referer
  • Luego compara si el referer domain es distinto al mydomain (ServerDomian) y verifica que dentro de los partners alguno tenga el dominio de referer. En caso de ser distintos setea un flag routing=true. En este caso se comparan los dominios y no los hosts, estos seria comparar jboss.com con jboss.org
  • Si no se routea y son iguales los dominios (refererDomain y myDomain) entonces verifica si los hosts no son iguales (es decir el serverhost y el refererHost). En caso de ser iguales se setea el flag routing=true
  • En el caso de que haya que routear hacemos:
    • TODO!!!!!!!!
  • Continua la ejecucion con el siguiente Valve en la cadena

2) SSOAutoLogOut:

  • Se comporta exactamente igual que cuando entramos por primera vez

3) SSOTokenManager

  • Se comporta exactamente igual que cuando entramos por primera vez en el pagina

4) SSOAutoLogin

  • Se comporta exactamente igual que cuando entramos por primera vez, pero cuando llamo al siguiente Valve en la cadena se encuentra con la “pagina” de autenticacion de JAAS.

En este punto llegamos a la  “pagina” que hace el login real por JAAS, (todavia no emprendemos la vuelta por la cadena de Valves), pero se realiza la Autenticacion y una vez que esto termina se vuelve por las Valves.

La autenticacion cae por medio de JAAS a la clase UsernameAndPasswordLoginModule.java al metodo initialize() el cual llama al metodo initialize() de la super clase que pertenece al paquete de javax.authenticacion.spi…… Este metodo levanta todas las opciones que definimos en el archivo: security-config.xml que define que LoginModule vamos a usar para un security-domain especifico (el cual especificamos en la aplicacion web de test)

Luego de esto vamos a pedir el userPassword con el metodo UsernameAndPasswordLoginModule.getUserPassword()

  • Le pregunta al provider si el usuario existe pasandole el nombre de usuario (que supuestamente se seteo en el initialize del padre)
  • Si existe se lee desde el provider el Identity (objeto Identity)
  • Valida si el identity esta activo o no.
  • Con esto obtiene el password encritapdo y lo devuelve

Luego vamos a buscar los Roles, para lo cual se realizan pasos muy similares a la obtencion del password. ver detalles.. itera sobre los grupos y sobre los roles definidos en el xml.

Ahora volvemos por la cadena hacia atras para devolverle el control al usuario junto con el response:

4) SSOAutoLogin:

  • Preguntamos si se efectuo SSO, en este caso no.
  • Pregunta si existe el principal y al parecer no se ha seteado todavia

3) SSOTokenManager:

  • Va devuelta a buscar el princpial, pero le sigue dando null
  • Pregunta si la cookie se encontro
  • Continua

2) SSOAutoLogout: no hace nada

1) SSOFederationReouter: no hace nada

En esta etapa el security_check de JAAS termino exitoso y ahora trata de forwardear a la pagina de inicio de nuestra aplicacion

Ahora volvemos a tener otro ciclo de invocaciones a las Valves ya que ahora tenemos creados los principals.

1) SSOFederationRouter:

  • El referer sigue siendo el mismo ya que la validacion de JAAS fue toda server side.. por lo tanto es: secure/index.jsp
  • hace las comparaciones de dominios y hosts por lo tanto routing=false
  • como no hay que hacer routing llama al siguiente Valve

2) SSOAutoLogout: hace lo mismo que en las rondas anteriores

3) SSOTokenManager:

  • SSotoken=null, cookiefound=null, logoutinprogres=null
  • SessionSSo nuevo
  • Llama al siguiente valve

4) SSOAutoLogin:

  • SSOSession nuevo
  • No se hace SSO
  • Llama a el siguiente Valve, no hay mas en la cadena
  • Como No se ejecuto SSO vamos a buscar el principal , aca esta el principal (hay que tener cuidado si estamos debuggeando de que no se nos muera la session porque sino el principal se pone en null)
  • Crea un SSOSession y le setea el principal

Volvemos por la cadena de valves:

3) SSOTokenManager:

  • Vamos a buscar el principal, si no encontramos la cookie
  • Crea la cookie a nivel de dominio (es decir para el dominio)
  • Para esto hace Util.sednSSOToken()
    • Genera el token SAML
    • Crea la cookie TOKEN con el dominio y el path
    • Crea el cookie SECURE_TOKEN le agrega el TOKEN
    • Y esto se agrega el RESPONSE HTTP
  • No esta la cookie

2) SSOAutoLogout: no hace nada

1) SSOFederationRouter: no hace nada

En este punto ya tenemos los TOKEN y SECURE_TOKEN Seteados

Para que las proximas llamadas lo utilicen.

Asignando numeros de punto flotante:

La asignacion de punto flotante varia ligeramente de la de los enteros. Debemos recordar que un Punto flotante es implicitamente un double (64 bits), no un float. Por lo tanto 32,2 es un double por default, entonces si lo queremos asignar a un float: float f=32,2F; o f=(float)32,2;

Asignando un literal que es muy grande para una variable :

Aca es donde el compilador nos da un error de Possible loss of presicion.
byte a=128; //Error!
byte a=(byte)128;

Como 128 por default es un int (32 bits) y byte solo tiene 8 bits

128 = 00000000000000000000000010000000

Se descartan los primeros 24 ceros y como son valores signed el 1 hace que sea un valor negativo. Recordemos que para hallar el valor de un numero negativo vamos vuelta todos los bits (01111111) y luego le sumamos 1 y nos da 10000000 que es 128 de vuelta! y ahora le aplicamos el signo y nos queda -128.

Asignando una variable primitiva a otra primitiva:

int a=6;  //asignamos el patron de bits 6 a la variable a
int b=a; // copiamos el patron de bits de la variable a a la variable b

Si cambiamos el contenido de a o b la otra no resulta afectada. Lo que hay que recordar es que una vez realizada las asignaciones a y b no se ferieren al mismo lugar en la memoria. Entonces a y b no comparten el mismo valor, solo tiene 2 copias iguales.

Asignacion de variables de referencia:

Button b=new Button();
Esto hace 3 cosas:

  • Crea la variable de referencia b
  • Crea un nuevo objeto Btton en el Heap
  • Asgina el nuevo objeto Button a la variable de referencia b

Scope de las variables:

Hay 4 scopes basicos:

  • Las variables static tiene el scope mas largo, se crean cuando la clase es cargada, y viven hasta que la clase es descargada de la JVM.
  • Las variables de instancia son las siguientes en la lista de duracion, son creada con una instancia nueva de un objeto y viven hasta que la instancia es removida.
  • Siguen las variables locales, viven mientras el metodo se mantenga en el stack.
  • Las variables de bloque viven solo mientras el codigo del bloque se ejecuta. (for, while, do, etc)

Usando una variable o un array que no esta inicializado y no asignado:

Cuando tratamos de usar una variable no inicializada, podemos tener distintos comportamientos dependiendo de si la variables es un array o una variable de tipo primitivo o un objeto.

  • Variable de instancia de tipo objeto y primitivas:
    Estas se inicializan a un valor por defecto cada vez que una nueva instancia es creada.
    Valores por defecto: object reference= null; (byte,short,int,long)=0; (float,double)=0.0; boolean=false; char=’\u0000′
    Recordemos que la asignacion por defecto null para los objetos nos tirara un Runtime Exception si tramotas de utilizar el operador punto (.) sin inicializar. (Null Pointer Exception). Para comprobar esto utilizamos la palabra reservada null.
  • Variables de instancia que son Arrays:
    Un array es un objeto, por lo tanto si un array es declarado como una variable de instancia y no lo hemos inicializado explicitamente va a tener el valor null. Pero, si el array es inicializado, que paso con los elementos contenidos en el array? Siempre se le da los valores por defecto a los elementos de un array, sin importar donde el array es declarado o instanciado.
  • Primitivas y objetos locales (stack, automatic)
    Una variable “automatica” debe ser asignada a un valor en el codigo, sino el compilador se va a quejar.

    • Primitivas locales:
      Las variables locales, incluyendo las primitivas, siempre deben ser inicializadas antes de tratar de ser usadas. Java no le da a las variables locales valores por defecto, explicatamente debemos inicializarlas. Hay que tener en cuenta dque el error puede saltar cuando inicializamos la variable dentro de un bloque que el compilador sabe que puede llegar a no correr.
    • Referencias a objetos locales:
      No se setea en null, ya que para el compilador null es un valor. Y como ni siquiera esta en null el compilador se queja.No se inicializa con ningun valor!
    • Arrays locales:
      A los elementos del array se le dan los valores por defecto, pero al objeto array no se lo inicializa cuando es declarado localmente, explicitamente debemos inicializar la referencia al array si esta declarada dentro de un metodo, pero en el momento que contruyamos el objeto array sus elementos se inicializan con el valor por defecto.

Asignando una variable de referencia a otra:

Las referencias a objetos (variables de referencia) funciaona de la misma manera. El contenido de una variable de referencia es un patron de bits. Entonces si asignamos  el valor de una variable de referencia a otra, el patron de bits es copiado.
Si asignamos un objeto existente a una nueva variable de referencia, luego las dos tendran el mismo patron de bits que hace referencia a un objeto en el Heap.
Entonces decimos, que hay un solo objeto pero 2 variables de referencia apuntando a el (a la misma instancia).
Una excepcion es la clase String que es inmutable y no se puede cambiar el valor de un objeto String. Se tiene un pool de Strings.

Java EE 5 Mambo!!

Abril 2, 2008

Tomen!

http://tap.javalobby.org/javaee5.mp3

Ladies and gentlemen, this is Java EE 5!

One, two, three, four, five

There’s a technology I use day and night
For my application with a web frontend
They told me to use .Net
But I really don´t wanna

So many bugs I fixed last week.
My code is neat and talk is a cheap
I like Glassfish, JSF, persistence API
And as I continue you know they´re gettin´ sweeter

So what can I do I really beg you my Lord
To me codin’ it´s just like a sport
All the bad code from the past, let me dump it
Please set in the trumpet

A little bit of injection in my life
A little bit of persistence by my side
A little bit of NetBeans is all I need
A little bit of EJB’s what I see
A little bit of standards in the sun
A little bit of XML all night long
A little bit web services here I am
A little bit of code makes me real man

This is Java EE 5!

Jump up and down and move your code around
Shake your head to the sound bury bad code under ground
Move one step left and one step right
One to the front and one to the side
Refactor it once and refactor it twice
If it looks like this you’re doin´ it right

A little bit of injection in my life
A little bit of persistence by my side
A little bit of NetBeans is all I need
A little bit of EJB’s is what I see
A little bit of standards in the sun
A little bit of XML all night long
A little bit web services here I am
A little bit of code makes me real man

This is Java EE 5!

Maybe I will grow up once. Maybe I won’t…

Adult Swing entero bordea los limites establecidos para el soporte de un televidente.. Pero con esta serie logran sobrepasar lo que mi generacion esta dispuesto a soportar..

La pagina lo dice todo.

http://www.adultswim.com/shows/12ozmouse/

Y el video explica el guion de la serie!

Sin duda alguna se recibe gratis cualquier Merchandise que quieran regalar de esta Serie!

Miren la biografia del escritor.. es asombroso el tipo.. esta totalmente limado.. despues de haber escrito todo eso

http://www.imdb.com/name/nm0537410/