Posted on may 8, 2007

Interfaces gráficos con F3

Form follows function (F3) es un nuevo lenguaje de scripting que está desarrollando Sun y que facilitará el diseño de interfaces gráficos de usuario.

Al permitir una construcción mucho más orientada al diseño gráfico del interfaz, con F3 es posible construir aplicaciones con animaciones muy próximas a los efectos conseguidos por Flex/OpenLaszlo en Flash. Además F3 se integra perfectamente con Java, Java 2D y Swing, pudiendo interaccionar con estas APIs de forma directa

En el blog de Chris Oliver (su creador) podemos encontrar, entre otras cosas:

Aún no se ha lanzado públicamente el proyecto, pero parece que será Open Source y estará albergado en java.net.

En los próximos dias Chris Oliver lo presentará de forma oficial en la Java One.

Posted on nov 26, 2006

Integrando la firma digital de documentos PDF con Apache Cocoon

Apache Cocoon es un framework de publicación XML. En Cocoon se define un origen XML (generator), una transformación XSL opcional (transformer) y se obtiene un documento (serializer) en el formato deseado (PDF, RTF, XHTML, Postscript, Excel, etc). Cocooon nos permite olvidarnos de los procesos de transformación de documentos XML, de forma que sólo tenemos que definir los distintos pasos por los que pasará nuestra información origen XML (pipelines).

En esta dirección podemos encontrar información adicional sobre Cocoon.

En un reciente artículo sobre firma digital de documentos PDF con iText veíamos cómo realizar la firma aislada de documentos PDF.
Para los que utilicen Cocoon, existe una forma de poder firmar los documentos PDF que se generen dinámicamente como resultado de una transformación. El proceso pasa por implementar nuestro propio serializer.

Lo que vamos a hacer es implementar una clase que herede de FOPSerializer (encargada de la generación de PDF) y, antes de que se emita el PDF como salida, pasar esta información por el proceso de firma descrito en el artículo anterior.

El resultado es la clase PDFSignSerializer.java que nos permite implementar el proceso.
Esta clase, al ser un nuevo serializer, debe ser definida en el fichero de configuración de Cocoon (sitemap.xmap):

<map:serializer logger="sitemap.serializer.fo2spdf" mime-type="application/pdf" name="fo2spdf"
src="org.apache.cocoon.serialization.PDFSignSerializer"/>

Y luego, ya podemos utilizarla en cualquier pipeline:

<map:match pattern="kk">
<map:generate src="samples/hello-world/content/hello.xml" />
<map:transform src="samples/hello-world/style/xsl/page2fo.xsl" />
<map:serialize type="fo2spdf" />
</map:match>

Posted on nov 26, 2006

Firmando documentos PDF con iText

iText es una librería Java gratuita para la generación de documentos PDF de forma dinámica. Es una de las más utilizadas por su simplicidad, disponibilidad de ejemplos y documentación (incluso se ha publicado un libro) y funcionalidades.

A parte del soporte para la generación de documentos PDF, ofrece una serie de características adicionales que pueden resultar muy interesantes:

Respecto a la firma digital, es posible firmar un documento PDF existente con un certificado X509 en formato PKCS#12 (en explorer se exportan como .PFX) de forma directa:


KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream("certificado.pfx"), "mi_password".toCharArray());
String alias = (String) ks.aliases().nextElement();
PrivateKey key = (PrivateKey) ks.getKey(alias, "mi_password".toCharArray());
Certificate[] chain = ks.getCertificateChain(alias);
PdfReader reader = new PdfReader("documento.pdf");
FileOutputStream fout = new FileOutputStream("documento_firmado.pdf");
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0', new File("/tmp"));
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.setReason("Prueba de firma digital con iText");
sap.setLocation("Spain");
sap.setContact("Ricardo Borillo");
stp.close();

Hay disponible una descripción más amplia de todo el proceso en esta dirección.

Así es como se vería el documento firmado cundo lo visualizamos con el Acrobat Reader:

Y la información de la firma en la pestaña vertical de la parte izquierda (Firmas):

Posted on oct 21, 2006

Indexación de contenido con Apache Lucene

Apache Lucene es un framework Java para la creación de índices de búsqueda full-text sobre cualquier tipo de contenido. Ejemplo de uso de Lucene pueden ser la implantación que hizo sourceforge.net o el producto de búsqueda de documentos locales para Linux Beagle.

La gran potencia y complejidad de Lucene reside en el hecho de que sea un framework, es decir, que Lucen nos da las herramientas para construir nuestro servicio de indexación y búsqueda utilizando el conjunto de clases que nos ofrece. Esto es muy potente ya que podemos definir exáctamente cómo se analizaran los contenidos para su indexación, control de la relevancia de los contenidos, eliminación de sufijos, control de palabras ruidosas, soporte para sinónimos, etc.

Con el tiempo y a medida que Lucene ha ido evolucionando, han ido surgiendo soluciones (muchas de ellas de pago) que ofrecian una capa de abstracción sobre los servicios básicos de Lucene para así hacer su uso más transparente y sencillo:

  • SearchBox: Servicio de indexación y búsqueda de contenidos
  • DBSight: Orientado a la indexación de bases de datos relacionales
  • Seekafile: Servicio Win32 de indexación al estilo de Google Desktop

Con la llegada de la versión 1.9 y 2.0 comenzaron a ampliarse los módulos relacionados con Lucene que se ofrecian a través de la web del proyecto. Con lo que ahora disponemos de distintos productos con los que llevar a cabo la indexación y búsqueda de contenidos:

  • Nutch: Software para búsquedas web al estilo Google. Consta de un crawler y de servicios distribuidos de indexación y búsqueda
  • Hadoop: Framework para la ejecución de aplicaciones en grandes clusters de equipos pequeños
  • Lucene4c: Implementación de Lucene en C
  • Lucy: Port a C de Lucene con bindings para Perl y Ruby
  • Solr: Servidor de indexación y búsqueda que expone sus funciones mediante un API XML/HTTP y ofrece servicios de caching, replicación y un interfaz administrativo web
  • Distintos ports de Lucene a otros lenguajes: C# o Python