miércoles, 27 de febrero de 2013

Detectar dispositivo móvil


Para detectar un dispositivo móvil en xpages, podemos insertar el siguiente código en el evento affertPageLoad.

var agente = context.getUserAgent().getUserAgent();
if (agente.match("iPhone")!==null || param.platform=="iphone") ||
   (agente.match("Android")!==null || param.platform=="android") ||
   (agente.match("iPad")!==null){
    context.redirecToPage("/movil.xsp", true);

}else{
    context.redirecToPage("/index.xsp", true);
}

viernes, 22 de febrero de 2013

Problema cache xpages en Mac y Linux

 Una aplicación de xpages funciona muy bien en Internet explorer aunque es raro pero bueno funciona, firefox, chrome en equipos con windows. Pero he observado que desde los navegadores de un Mac o Linux no refresca la xpages a no ser que las forcemos.

Y he utilizado la etiqueta de No chache en el head de la página, he utilizado la propiedad de xsp.application.forcefullrefresh=true, pero nada de nada.

Al final he hecho lo siguiente y funciona bien.

Pasos: 

1.- Primero insertamos en el evento de la xpages beforePageLoad el siguiente código 

// Importamos paquete de java que vamos a utilizar 
importPackage( org.restoy.cache ); 

//Capturamos la respuesta de la xpages 
var ec = facesContext.getExternalContext(); 
var response = ec.getResponse(); 
var writer = response.getWriter(); 

// Iniciamos headers y ponemos el tiempo que caducará 
var now = new Date(); 
response.setDateHeader("Expires", 
now.getTime() + (1000)); 
response.setHeader("Cache-Control", "public"); 


// Iniciamos response cache header 
var reqParam = facesContext.getRequestParameters(); 
var resCH = new SHResponseCacheHeader(); 
reqParam.setResponseCacheHeader( resCH ); 

//Imprimimos un test 
writer.write( "Ahora esta página no utiliza la cache del navegador: " ); 
writer.write( now.getTime().toString() ); 


2.- Ahora creamos una clase de Java con el paquete org.restoy.cache 

// Con esto utilizamos el ResponseCacheHeader para inicializar el "expire" y evitar que la xpage ponga -1 y por tanto se inicializará con la fecha que nosotros le digamos. 
package org.restoy.cache; 

import javax.servlet.http.HttpServletResponse; 
import com.ibm.xsp.context.RequestParameters.ResponseCacheHeader; 

public class SHResponseCacheHeader implements ResponseCacheHeader { 

public SHResponseCacheHeader(){} 

public boolean initResponseCacheHeader(HttpServletResponse arg0){ 
return true; 



3.- Ya estaría todo terminado, ahora si lo comprobamos con navegadores de mac o en linux, y vemos el header podemos comprobar que ya no utiliza la cache del navegador, puesto que expira a con la misma fecha que cuando se carga y el navegador entenderá que ya esta caducada y la solicitará de nuevo al servidor. 

Bueno todo esto es lo que he tenido que hacer para que funcione correctamente, me hubiera gustado encontrar una solución mas sencilla, pero por ahora creo que esta es la única solución. Y si estáis diseñando aplicaciones de mantenimiento con xpages como lo hago yo últimamente, tener en cuenta que desde cualquier navegador en mac o linux vais a tener un problema si no controláis la cache. ya que documentos que por ejemplo hayáis eliminado, se seguirán viendo en las vistas, teniendo una sensación de muy mala aplicación.

Podcast sobre Macintosh


Hoy quiero recomendar un podcast que sigo desde hace años y es muy interesante, habla de todo lo relacionado con el mundo apple.

Este podcast se llama Puromac, lo dirigen Flavio Guinsburg y Federico Hatoum, y como ellos dicen es el programa donde "hablamos de las computadoras Macintosh y de todos los productos de apple" desde Puerto Rico y New York.

Un saludo a los dos y espero que sigan durante muchos años con el podcast.


Texto enriquecido en vistas



¿Cómo podemos insertar un campo de texto enriquecido en una vista Lotus Notes?

Los campos de texto enriquecido de Lotus Notes son un poco especiales comparados con el resto de campos, éstos pueden almacenar cualquier tipo de objeto y texto con formato.

Si alguna vez necesitamos visualizar el contenido del campo de texto enriquecido en una columna de una vista, nos daremos cuenta de que no se visualiza nada.

La solución a este problema pasa por utilizar la formula @Abstract() que mediante algunos parámetros podemos extraer sólo el texto de dicho campo.

Si nos situamos en una columna de una vista de lotus, a continuación insertamos el siguiente código:

@Abstract([TextOnly]; 500; ""; campotextoenriquecido)

De esta forma conseguimos sacar hasta 500 caracteres del campo de texto enriquecido y lo más importante es que se visualiza en la columna de la vista.

Podemos completar la formula comprobando si el campo esta vacío:

@If (campotextoenriquecido != ""); (@Abstract([TextOnly]; 500; ""; campotextoenriquecido))