Categoría: javahispano

JBoss Seam: renderizar un xhtml externo

02 dic 2011

Todos sabemos las ventajas que tiene trabajar con plantillas xhtml a la hora de generar la capa de presentación o incluso para generar emails o pdfs a través de seam.

El problema viene cuando utilizamos una gran cantidad de plantillas xhtml personalizadas y necesitamos gestionarlas de manera externa a la aplicación y almacenarlas por ejemplo en un repositorio externo: BD, gestor documental, ftp, en disco, etc.

Por defecto, el render de Seam permite generar renderizados de vistas (views) que están contenidas dentro de la propia aplicación. Un ejemplo:

renderer.render("/pdf/templatePdf.xhtml");

La anterior linea intentará generar el renderizado a partir de un resource en la propia aplicación, es decir, el archivo templatePdf.xhtml debe estar físicamente en el webapps de la aplicación.

¿Y qué ocurre si tenemos un templatePdf.xhtml externo, quizás en un repositorio o lo queremos generar dinámicamente?

Lo que tenemos que hacer es implementar un cargador de resources que controle cuándo queremos renderizar una vista normal o una vista en un repositorio externo.

Esta distinción se hará a nivel de URL, es decir, cuando queramos renderizar una vista normal nos bastaría con:

renderer.render("/pdf/templatePdf.xhtml")

mientras que para renderizar vistas externas podríamos poner algo como:

renderer.render("CUSTOM-/pdf/templatePdf.xhtml")

es decir, anteponemos un prefijo, por ejemplo “CUSTOM-”.

Ahora nos toca decirle al cargador de resources que cuando se solicite un recurso con el prefijo “CUSTOM-” lo trate de manera especial, cargándolo por ejemplo de un repositorio de plantillas, de un FTP, generándolas nosotros dinámicamente o lo que necesitéis. Aquí os pongo la implementación de la clase:


import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.contexts.ServletLifecycle;
import org.jboss.seam.core.ResourceLoader;
import org.jboss.seam.util.Resources;

@Name("org.jboss.seam.core.resourceLoader")
@Scope(ScopeType.STATELESS)
public class CustomResourceLoader extends ResourceLoader {

    public static final String TEMPLATE_PREFIX = "CUSTOM-";

    @Override
    public URL getResource(final String resource) {
        URL url = null;
        if (resource.startsWith(TEMPLATE_PREFIX)) {
            final String uriViewId = resource.substring(TEMPLATE_PREFIX.length());
            try {
                url = new URL("internal", "", 0, uriViewId, getHandler(uriViewId));
            } catch (final MalformedURLException e) {
                if (log.isErrorEnabled()) {
                    log.error("Unable to build the URL", e);
                }
            }
        } else {
            url = Resources.getResource(resource, ServletLifecycle.getServletContext());
        }
        return url;
    }

    // @return Our own implementation of an URLStreamHandler to get the template
    //         from the content repository.
    private static URLStreamHandler getHandler(final String uriViewId) {
        return new URLStreamHandler() {
            private final String uuid = uriViewId;

            @Override
            protected URLConnection openConnection(final URL url) throws IOException {
                return new URLConnection(url) {

                    @Override
                    public void connect() throws IOException {
                        // Gets not called in this case
                    }

                    @Override
                    public InputStream getInputStream() throws IOException {
                        initHandler();
                        try {
                            // Cargamos el contenido de la plantilla .xhtml
                            byte [] content = ....... ;
                            final InputStream input = new ByteArrayInputStream(content);
                            return input;
                        } catch (final Exception e) {
                            throw new IOException(e.getMessage(), e);
                        }
                    }

                    private void initHandler() {
                        log.debug("Init Handler");
                    }
                };
            }
        };
    }

    /**
     * Sistema de Logs
    */
    protected static transient Log log = LogFactory.getFactory().getInstance(CustomResourceLoader.class);

}

Quizás el equipo de desarrollo de Seam Framework propongo otro tipo de soluciones en el futuro para estos casos, pero por ahora, tenemos que hacer un poco de magia.

Tips: Obtener la conexión JDBC de un EntityManager (en JPA 2.0)

11 feb 2011

Normalmente la conexión JDBC utilizada por JPA queda totalmente oculta para el programador, pero en ocasiones puede ser necesario acceder ella.
Con JPA 1.0, teníamos que hacer algunos “trucos de mágia” con el Delegate para conseguirlo, pero ahora con JPA 2.0 disponemos del método unwrap que nos permite tener acceso entre otras cosas a la conexión JDBC.

    entityManager.getTransaction().begin();
    java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
    // TODO interactuamos con la conexión JDBC.

    entityManager.getTransaction().commit();

Nuevo cliente viafirma para Nintendo Wii

28 dic 2010

Humor: evolución del framework perfecto

23 dic 2010

Hace dos años y medio ya comentamos sobre las virtudes de nuestro framework perfecto. Transcurrido todo ese tiempo, el framework sigue dando sus frutos, con resultados bastante didácticos.

http://www.xnoccio.com/es/320-humor-el-framewok-perfecto/ (mayo 2008)

framework perfecto en 2008

framework perfecto - 2001

Feliz navidad y bebed con moderación.

Tips: Configurar PostgreSQL en Glassfish 3

12 dic 2010

Instalación del driver
Descargamos el driver JDBC desde http://jdbc.postgresql.org y lo copiaremos al directorio glassfish/lib o si preferimos utilizarlo unicamente en uno de los dominios lo copiaremos en glassfish/domains/domain1/lib/ext

Configuración del Datasource

Una vez reiniciado el servidor, accedemos a la consola de administración y seleccionamos crear un nuevo pool de conexiones (Resources/JDBC/Connection Pools), indicando el nombre del pool y el tipo de conexión.

Configuramos los parámetros de conexión a la base de datos.

Para terminar comprobamos que la conexión a la base de datos puede realizarse intentando un ping.

Configuración del recurso

Una vez tengamos creado el pool de conexiones y hayamos comprobado que la configuración es correcta, definimos un recurso datasource que podrá ser consumido por nuestras aplicaciones mediante JNDI.

Uso del datasource

Para ello solo tendremos que indicar en nuestro persistence.xml el nombre JDNI de recurso, en este caso jdbc/default.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="default" transaction-type="JTA">
        <jta-data-source>jdbc/default</jta-data-source>
    </persistence-unit>
</persistence>

Buscamos partners!

22 nov 2010

En la actualidad buscamos partners que deseen ampliar su capacidad de productos y servicios gracias al catálogo de productos y servicios de firma digital de Viafirma, tanto a nivel nacional como principalmente internacional (además de en España, disponemos de partners y distribuidores en países como Chile, República Dominicana, Panamá…). Apostamos por la colaboración con empresas desarrolladoras, consultoras, empresas TIC, integradores, emprendedores, distribuidores, freelances… que conocen mucho mejor las necesidades de sus propios clientes.

Ser partner de Viafirma no puede ser más sencillo; éstas son nuestras claves:

  • Relación win-win. Creemos en una relación beneficiosa para ambas partners; sólo ganamos si nuestro partner gana.
  • Riesgo 0% para el partner. Aunque disponemos de servicios para partners con coste tales como soporte, certificaciones, formación, desarrollos específicos, etc., estos servicios son absolutamente opcionales para el partner. No obligamos a ninguna empresa a realizar desembolso alguno para iniciar su colaboración con nosotros.
  • Ampliación de gama de productos y servicios innovadores. Nuestros partners se benefician de nuestro catálogo de productos y servicios, pudiendo ampliar su oferta a sus clientes. Algunos de nuestros productos son absolutamente únicos en la actualidad a nivel mundial, como puede ocurrir con la firma electrónica con certificados digitales en dispositivos móviles como iPhone, iPad, Android, BlackBerry… y próximamente Symbian v3 y Windows Phone 7 (observa nuestro vídeo demostrativo).
  • Disponibilidad de recursos. Ponemos a disposición de nuestros partners de forma totalmente gratuita recursos como servidores de desarrollo, aplicaciones para realizar demostraciones, ayuda técnica, etc.
  • No competimos con nuestros partners. Podemos colaborar con nuestros partners en proyectos o servicios si así lo requieren, pero somos conscientes de que nuestros partners son nuestros aliados y evitamos cualquier posible competencia.
  • Múltiples disposiciones. Nuestros productos pueden ser instalados en las dependencias de los clientes (licencias in-house) pero también pueden ser consumidos en la nube siguiendo un paradigma SaaS -Software as a Service- (con despliegues cloud computing).
  • Productos multilenguaje. Todos nuestros productos son traducibles según el estándar i18n y muchos de ellos ya disponen de traducciones. Las API’s siguen estándares de desarrollo internacional.
  • Acceso a nuestros productos a menor coste. Nuestros partners pueden obtener nuestros productos y servicios a un menor coste del oficial.
  • Política de precios claros. Nuestros productos siempre tienen los mismos precios, independientemente de si un cliente contacta con nosotros o con un partner o distribuidor de Viafirma, evitando cualquier tipo de confusión y mejorando la sensación general de los clientes.
  • Estamos abiertos a colaborar con nuestros partners para crear nuevos productos, realizar adaptaciones a nuestras plataformas, realizar desarrollos específicos, etc.

En definitiva, una empresa puede mejorar su catálogo de servicios y productos con soluciones innovadoras sin ningún tipo de riesgo económico ni inversión inicial, estableciendo una sinergia estratégica donde nosotros crecemos con el crecimiento de nuestro partner.

Invitamos por ello a cualquier empresa que pueda estar interesada a contactar con nosotros a través del formulario de la web de Viafirma.

Por fin un JavaEE6 para dominarlos a todos

16 nov 2010

Las grandes deficiencias que hasta ahora tenía la plataforma J2EE/JEE han hecho que históricamente fuese imprescindible utilizar un framework web del estilo de Struts, Seam o Spring para realizar una aplicación JEE. Esta situación hacía que la estandarización del desarrollo de software dentro de una organización fuese muy compleja e incluso improductiva, pero ahora la situación se ha vuelto un poco más clara y manejable gracias a la definición de JEE6.

Por primera vez JEE ofrece un framework “real” con injección de dependencias, motor de plantillas, seguridad, persistencia, cache, etc…
A modo de ejemplo, ya no necesitamos iBatis o Hibernate (JPA 2.0 nos proporciona un acceso a datos consistente), ya no necesitamos facelets (ahora forma parte del estandar JSF 2.0), ya no necesitamos Spring IoC o Google Guice (ahora la inyección forma parte del estandar con CDI) y en general da soluciones a la mayoría de los problemas que antes requerían de algún truco o framework externo.

En definitiva, podremos decir que nuestro framework es JEE 6 en lugar de Spring o Seam. Y no se trata de dejar de utilizar Seam o Spring, sino de poder utilizarlos como un añadido, apoyando  el desarrollo sobre JEE6. En este sentido hemos reescrito el propio “Framework Viavansi” para que pase a ser una pieza más sobre JEE6.

Por supuesto siempre existirán caminos alternativos totalmente válidos como Spring, pero ahora ya disponemos de un “camino estandar” que debería ayudarnos si nuestro objetivo es la homogenización de los desarrollos en una organización.

Por nuestra parte llevamos bastante tiempo realizando pruebas con JEE6 Web profile  y estamos listos para empezar utilizarlo en todos nuestros nuevos proyectos a principios de 2011 (Si los clientes nos dejan :p).

Humor: Nuestros libros de referencia Java

21 sep 2010


Quizás también te interese conocer nuestro Framework perfecto o como saber cuando una tecnología está desfasada.

Nota: Para los que no capten la sutil diferencia, pueden consultar los originales en Amazon: Cryptography with Java y J2EE Developement without EJB.

Humor: Firma digital en una antigua máquina de escribir Oliveti

01 sep 2010

En nuestro esfuerzo por ser una plataforma de firma digital universal, nuestro departamento de I+D ha conseguiro ampliar aun más nuestra matriz de compatibilidad consiguiendo realizar una firma digital en una antígua Oliveti!.
El video no tiene desperdicio :p.

De esta forma junto con las plataforma ya soportadas Linux (Firefox, Chrome), MacOS (Safari, Firefox), Windows (Firefox,Chorme, IE 6. IE7, IE8), Android, iPhone, iPad; Ahora incorporamos soporte para Oliveti Linea 98!!

Viafirma ya disponible en el Apple Store y Android Market

29 jul 2010

El componente de Viafirma para Android/iPhone/iPad ya está disponible tanto en la App Store como el Android Market de forma totalmente gratuíta, de esta forma Viafirma se convierte en la primera plataforma en soportar la autenticación y firma digital en estos dispositivos!.

Disponible en App Store y Android Market cualquier país en Ingles, Frances y Español.

Una vez más, la plataforma amplía su Matriz de Compatibilidad, garantizando el principio de Neutralidad Tecnológica citada en la Ley 11/2007 de Acceso Electrónico de los Ciudadanos a los Servicios Públicos.

Formatos de firma  disponibles desde iPad/iPhone/Android:

  • XMLSignature
  • XAdES-BES
  • XAdES-EPES
  • XAdES-T
  • XAdES-C
  • XAdES-XL
  • XAdES-A
  • CMS (Cryptographic Message Syntax)
  • Facturae
  • PDF-Signature

APIs y módulos disponibles para la integración de terceros:

  • Java
  • .Net
  • Php
  • Pyton
  • Drupal
  • Joomla
  • Django

Para ofrecer servicios a estos dispositivos puedes instalar Viafirma en tus instalaciones sobre:

  • Websphere
  • Weblogic
  • Tomcat 5, Tomcat 6
  • GlassFish v3

O si lo prefieres puedes utilizar directamente nuestro servicio “on demand” y ofrecer a tus clientes autenticación y firma digital de una forma muy sencilla y económica.

Autoridades de certificación soportadas por la plataforma:

  • Firma Profesional
  • Camerfirma (Cámara de Comercio)
  • Ancert (Agencia Notarial de Certificación)
  • Izenpe (Gobierno Vasco)
  • ACA (Autoridad de Certificación de la Abogacía)
  • ANF AC (Asociación Nacional de Fabricantes)
  • Avansi (primera CA autorizada en la República Dominicana)
  • Cámara de Comercio y Producción de Santo Domingo (República Dominicana)
  • Firma Digital (Sistema Nacional de Certificación Digital de Costa Rica)
  • SINPE (Sistema Interbancario de Negociación y Pago Electrónico) – Costa Rica
  • DNIe * no disponible para iPhone/iPad/Android
  • FNMT (Fábrica Nacional de Moneda y Timbre) * requiere convenio con la FNMT

Más información en bubiloop:Viafirma Mobile App

Artículos relacionados:

http://www.xnoccio.com/1247-firma-digital-movil-en-ipad_iphone_firma_electronica/

http://www.xnoccio.com/1201-android-y-mi-certificado-digital/