<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Xnoccio.com &#187; Manuel Navarro Almuedo</title>
	<atom:link href="http://www.xnoccio.com/es/author/mnavarro/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xnoccio.com</link>
	<description>Blog de viavansi</description>
	<lastBuildDate>Fri, 27 Jan 2012 19:59:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JBoss Seam: renderizar un xhtml externo</title>
		<link>http://www.xnoccio.com/es/2384-jboss-seam-renderizar-un-xhtml-externo/</link>
		<comments>http://www.xnoccio.com/es/2384-jboss-seam-renderizar-un-xhtml-externo/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 08:21:57 +0000</pubDate>
		<dc:creator>Manuel Navarro Almuedo</dc:creator>
				<category><![CDATA[javahispano]]></category>
		<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://www.xnoccio.com/?p=2384</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Todos sabemos las ventajas que tiene trabajar con plantillas xhtml a la hora de generar la capa de presentación o incluso para generar <a href="http://docs.jboss.org/seam/2.0.0.GA/reference/en/html/mail.html">emails</a> o <a href="http://docs.jboss.org/seam/latest/reference/en-US/html/itext.html">pdfs</a> a través de seam.</p>
<p>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.</p>
<p>Por defecto, el render de Seam permite generar renderizados de vistas (views) que están contenidas dentro de la propia aplicación. Un ejemplo:</p>
<pre>
renderer.render("/pdf/templatePdf.xhtml");
</pre>
<p>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.</p>
<p>¿Y qué ocurre si tenemos un templatePdf.xhtml externo, quizás en un repositorio o lo queremos generar dinámicamente?</p>
<p>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.</p>
<p>Esta distinción se hará a nivel de URL, es decir, cuando queramos renderizar una vista normal nos bastaría con:</p>
<pre>
renderer.render("/pdf/templatePdf.xhtml")
</pre>
<p>mientras que para renderizar vistas externas podríamos poner algo como:</p>
<pre>
renderer.render("CUSTOM-/pdf/templatePdf.xhtml")
</pre>
<p>es decir, anteponemos un prefijo, por ejemplo &#8220;CUSTOM-&#8221;.</p>
<p>Ahora nos toca decirle al cargador de resources que cuando se solicite un recurso con el prefijo &#8220;CUSTOM-&#8221; 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:</p>
<pre>

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);

}
</pre>
<p>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.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/2384-jboss-seam-renderizar-un-xhtml-externo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>XWiki: autenticando con Viafirma</title>
		<link>http://www.xnoccio.com/es/587-xwiki-autenticando-con-viafirma/</link>
		<comments>http://www.xnoccio.com/es/587-xwiki-autenticando-con-viafirma/#comments</comments>
		<pubDate>Tue, 18 May 2010 07:45:13 +0000</pubDate>
		<dc:creator>Manuel Navarro Almuedo</dc:creator>
				<category><![CDATA[viafirma]]></category>
		<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[autenticación digital]]></category>
		<category><![CDATA[DNIe]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://xnoccio.com/?p=587</guid>
		<description><![CDATA[Es de todos conocidos los grandes beneficios de usar una Wiki, para tener organizado y actualizado una gran cantidad de información y contenido, de forma que pueda ser rápidamente consultada y actualizada. Sin ninguna razón especial más allá de la simple curiosidad, vamos a poner como ejemplo en este caso una &#8220;implementación&#8221; wiki basada en [...]]]></description>
			<content:encoded><![CDATA[<p>Es de todos conocidos los grandes beneficios de usar una <a title="es.wikipedia.org/wiki/Wiki" href="http://es.wikipedia.org/wiki/Wiki" target="_blank">Wiki</a>, para tener organizado y actualizado una gran cantidad de información y contenido, de forma que pueda ser rápidamente consultada y actualizada. Sin ninguna razón especial más allá de la simple curiosidad, vamos a poner como ejemplo en este caso una &#8220;implementación&#8221; wiki basada en Java (<strong><a title="www.xwiki.org" href="http://www.xwiki.org/" target="_blank">XWiki</a></strong>) y vamos a conseguir de forma sencilla que los usuarios puedan logarse con su Certificado Digital o DNI electrónico (DNIe).</p>
<p>Como no podría ser de otra forma, vamos a hacer uso del servicio de autenticación de la plataforma <strong><a title="www.viafirma.org" href="http://www.viafirma.org" target="_blank">Viafirma</a></strong>, sirviéndonos de su <strong>cliente de autenticación, </strong>apoyándonos en su espectacular <a title="Matriz de compatibilidad" href="http://www.viafirma.com/viafirma/informacion/tecnicas/index.html#matriz-compatibilidad" target="_blank">matriz de compatibilidad</a>, además mantendremos el acceso por usuario/contraseña habitual de XWiki. Para realizar esta integración nos hemos basado principalmente en la documentación que podemos encontrar en las páginas oficiales de ambas plataformas, por un lado tenemos a <a title="www.viafirma.com" href="http://www.viafirma.com/" target="_blank">Viafirma</a> y por otro lado la web para desarrolladores de <a title="dev.xwiki.org" href="http://dev.xwiki.org/" target="_blank">XWiki Development Zone</a></p>
<p>Primero una idea de lo que queremos hacer:</p>
<p>Dentro del formulario de login de XWiki, pondremos un enlace a una url dentro del propio XWiki que sea de la forma:<br />
<code>http://xwikiserver/.../viafirma.login</code></p>
<p>Esta URL será capturada dentro de la XWiki por un Filter que enviará al usuario automáticamente a Viafirma, que será el encargado de pedir el certificado digital al usuario y analizarlo (validarlo), tras esto enviará al usuario nuevamente a la XWiki (Viafirma coloca en la Session de esta petición el resultado de la validación del Certificado y será XWiki el encargado de tratar ese resultado) con una url con la forma:</p>
<p><code>http://xwikiserver/.../viafirmaAuthentication</code></p>
<p>El Request de esta URL será capturado por un Servlet que extiende al ViafirmaClientServlet, que nos proporciona el cliente de Viafirma, capturando de sesión el UsuarioGenericoViafirma que se ha obtenido. Este usuario aún no es un &#8220;usuario XWiki&#8221;. Este mismo Servlet se encargará de capturar la dirección a la que el usuario inicialmente quería acceder en XWiki y lo redirigirá allí de nuevo, siempre y cuando los resultados de Viafirma hayan sido válidos.</p>
<p>Por otro lado, extenderemos la clase XWikiAuthServiceImpl que implementa el servicio básico de autenticación de XWiki, introduciendo la posibilidad de realizar el Login en XWiki a partir de un UsuarioGenericoViafirma que tenemos en Sesión, para esto usaremos el API nativo de XWiki.</p>
<p>Por simplicidad para este ejemplo he adoptado la siguiente política de logado: dada una <strong>persona con NIF 12345678Z</strong>, su <strong>&#8220;Usuario XWiki&#8221; correspondiente será XWiki.12345678Z</strong>, es decir, debe existir un usuario dado de alta en XWiki cuyo Login coincida con el DNI de la persona. Cuando tengamos un UsuarioGenericoViafirma, consultamos su NIF y le preguntamos la XWiki a través de su API si existe usuario con ese Login. ¿Podría hacerse de forma más elaborada? Por supuesto, en vez de buscar un usuario con Login igual al Nif, podríamos haber definido una propiedad nueva para los Usuarios XWiki y para usarlo con este propósito, cuando lo hagáis no dudéis en poner vuestros comentarios al final de este post.</p>
<p>La secuencia de llamadas entre todos estos componentes lo podemos ver aquí:</p>
<p><a href="http://www.xnoccio.com/wp-content/uploads/2010/05/Secuencia.png" target="_new"><img class="aligncenter size-full wp-image-1049" title="Diagrama de Secuencia" src="http://www.xnoccio.com/wp-content/uploads/2010/05/Secuencia.png" alt="" width="1103" height="798" /></a></p>
<p>Vamos a ir explicando paso a paso cómo hacer todo esto:<br />
<span style="font-weight: bold; font-style: italic;">Paso 1.- </span>Modificación del formulario de Login</p>
<p>Debemos editar el fichero<em><strong> templates/login.vm </strong></em>e introduciremos la redirección al servlet. Os propongo dos opciones, un enlace dentro de formulario ya existente y un formulario nuevo (para nuestro ejemplo funcionarán los dos):</p>
<pre>...
&lt;form&gt;
...
#template("viafirmaLink.vm") &lt;-Hiperenlace: opcion A
...
&lt;/form&gt;
#template("viafirmaForm.vm") &lt;- Formulario: opción B
...</pre>
<p>Posteriormente copiaremos los ficheros <em><strong>viafirmaLink.vm</strong></em> y <em><strong>viafirmaForm.vm</strong></em> dentro del directorio <em><strong>templates</strong></em>.<br />
Contenido de <em><strong>viafirmaLink.vm</strong></em>:</p>
<pre>&lt;div style="margin: 1em;"&gt;
 &lt;a href="viafirma.login"&gt;ACCESO CON CERTIFICADO DIGITAL&lt;/a&gt;
 &lt;br/&gt;
&lt;/div&gt;</pre>
<p>Contenido de <em><strong>viafirmaForm.vm</strong></em>:</p>
<pre>&lt;form id="loginFormViafirma" action="viafirma.login" method="post"&gt;
 &lt;div&gt;
 &lt;fieldset&gt;
 &lt;legend&gt;Certificado Digital&lt;/legend&gt;
 &lt;div&gt;&lt;span&gt;&lt;input type="submit" value="VIAFIRMA"/&gt;&lt;/span&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/form&gt;</pre>
<p>Vemos que las dos opciones propuesta envian al usuario a la URL <em><strong>http://xwikiserver/&#8230;/viafirma.login </strong></em>.</p>
<p><em><strong>Paso 2.-</strong></em> Implementación de un <strong>Filter</strong>, que será el encargado de capturar las peticiones a <em><strong>&#8230;/viafirma.login</strong></em> y enviar al usuario  hacia Viafirma para que se autentique:</p>
<pre>package org.viafirma.xwiki;
public class AuthenticationFilter implements Filter { ... }</pre>
<p><em><strong>Paso 3.-</strong></em> Implementación de un <strong>Servlet </strong>que recogerá de vuelta el resultado ofrecido  por parte de Viafirma tras el análisis del certificado, capturando las peticiones a <em><strong>&#8230;/viafirmaAuthentication</strong></em> y coloque en sesión al usuario UsuarioGenericoViafirma:</p>
<pre>package org.viafirma.xwiki;
public class AuthenticationServlet extends ViafirmaClientServlet implements Serializable { ... }</pre>
<p><em><strong>Paso 4.- </strong></em>Implementaremos un mecanismo usando otro <strong>Filter</strong>, para que <strong>Viafirma use  una CSS</strong> definida por nosotros mismos. Viafirma &#8220;pide&#8221; por defecto una CSS llamada <em><strong>viafirmaStyle.css</strong></em>. En este ejemplo hemos optado por que XWiki sirva el CSS que usará Viafirma, aunque quizás lo más conveniente sea colocar este CSS en un servidor externo, por ejemplo un Apache, pero de todos modos vamos a hacerdo a modo de ejemplo. Bastaría con colocar una regla en Apache (por ejemplo) para que las peticiones al archivo <em><strong>viafirmaStyle.css </strong></em>no pasen a la XWiki, esto os lo dejo a vosotros.</p>
<p><strong><em>Paso5.-</em> Extenderemos </strong>el  <strong>Servicio de Autenticación de XWiki</strong>, que sustituirá a la que tiene por  defecto esta plataforma:</p>
<pre>package org.viafirma.xwiki;
public class ViafirmaAuthImpl extends XWikiAuthServiceImpl implements  Serializable { ... }</pre>
<p>Posteriormente, deberemos <strong>modificar </strong>el fichero <strong>xwiki.cfg</strong> de XWiki  añadiendo o modificando:</p>
<pre>xwiki.authentication.authclass=org.viafirma.xwiki.ViafirmaAuthImpl</pre>
<p><span style="font-weight: bold; font-style: italic;">Paso 6.- </span><strong>Configuraremos </strong>el <strong>web.xml</strong> de XWiki para dar de alta estos Filters y Servlets que hemos creado, adaptando los valores de los parámetros a nuestro entorno (url de Viafirma y ruta al css):</p>
<pre>...
 &lt;filter&gt;
 &lt;filter-name&gt;ViafirmaLoginFilter&lt;/filter-name&gt;
 &lt;filter-class&gt;org.viafirma.xwiki.AuthenticationFilter&lt;/filter-class&gt;
 &lt;init-param&gt;
 &lt;param-name&gt;VIAFIRMA_URL&lt;/param-name&gt;
 &lt;param-value&gt;http://viafirma.viavansi.com/viafirma&lt;/param-value&gt;
 &lt;/init-param&gt;
 &lt;init-param&gt;
 &lt;param-name&gt;VIAFIRMA_WS&lt;/param-name&gt;
 &lt;param-value&gt;http://viafirma.viavansi.com/viafirma&lt;/param-value&gt;
 &lt;/init-param&gt;
 &lt;/filter&gt;
 &lt;filter&gt;
 &lt;filter-name&gt;ViafirmaStyleFilter&lt;/filter-name&gt;
 &lt;filter-class&gt;org.viafirma.xwiki.ViafirmaStyleFilter&lt;/filter-class&gt;
 &lt;init-param&gt;
 &lt;param-name&gt;PATH_CSS&lt;/param-name&gt;
 &lt;param-value&gt;D:/xwiki/skins/colibri/colibri.css&lt;/param-value&gt;
 &lt;/init-param&gt;
 &lt;/filter&gt;

 &lt;filter-mapping&gt;
 &lt;filter-name&gt;ViafirmaLoginFilter&lt;/filter-name&gt;
 &lt;url-pattern&gt;*.login&lt;/url-pattern&gt;
 &lt;/filter-mapping&gt;
 &lt;filter-mapping&gt;
 &lt;filter-name&gt;ViafirmaStyleFilter&lt;/filter-name&gt;
 &lt;url-pattern&gt;*.css&lt;/url-pattern&gt;
 &lt;/filter-mapping&gt;
 ...
 &lt;!-- Servlet de Autenticación de Viafirma--&gt;
 &lt;servlet&gt;
 &lt;servlet-name&gt;viafirmaAuthentication&lt;/servlet-name&gt;
 &lt;servlet-class&gt;org.viafirma.xwiki.AuthenticationServlet&lt;/servlet-class&gt;
 &lt;/servlet&gt;
 &lt;servlet-mapping&gt;
 &lt;servlet-name&gt;viafirmaAuthentication&lt;/servlet-name&gt;
 &lt;url-pattern&gt;/viafirmaAuthentication/*&lt;/url-pattern&gt;
 &lt;/servlet-mapping&gt;</pre>
<p>Finalmente tendremos esto:</p>
<p><a href="http://www.xnoccio.com/wp-content/uploads/2010/05/Clases1.png" target="_new"><img class="aligncenter size-full wp-image-1051" title="Diagrama de Clases" src="http://www.xnoccio.com/wp-content/uploads/2010/05/Clases1.png" alt="" width="727" height="458" /></a></p>
<p>Teneis el proyecto mavenizado y todos los fuentes usados en este ejemplo aquí:<br />
<a href="http://www.xnoccio.com/wp-content/uploads/2010/05/viafirma-client-xwiki.zip" target="new"><br />
<img title="Descarga de fuentes aquí" src="http://www.xnoccio.com/wp-includes/images/crystal/archive.png" alt="Descarga de fuentes aquí" /></a></p>
<p>Para integrar este ejemplo en XWiki, sólo es necesario:</p>
<ol>
<li> Empaquetar las clases generadas en un .jar y copiarlo en el WEB-INF/lib de XWiki, también deberá copiar en esa carpeta todas las librerías dependientes.</li>
<li>Realizar las modificaciones anteriormente indicadas en el formulario de Login.</li>
<li>Copiar los archivos .vm a la ruta indicada anteriormente.</li>
<li>Modificar y configurar el web.xml de XWiki.</li>
</ol>
<p>Aquí os dejo unas capturas de pantalla para demostraros que todo esto funciona correctamente <img src='http://www.xnoccio.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Formulario para logarnos:</p>
<p><a href="http://www.xnoccio.com/wp-content/uploads/2010/05/xwiki_login.png" target="_new"><img class="aligncenter size-full wp-image-1095" title="XWiki: Formulario de Login" src="http://www.xnoccio.com/wp-content/uploads/2010/05/xwiki_login.png" alt="" width="600" height="400" /></a></p>
<p>Finalmente, vemos que XWiki nos ha logado correctamente:</p>
<p>Selección del Certificado Digital en Viafirma, vereis que tiene el CSS que queremos (obviamente ese CSS se puede mejorar) :</p>
<p><a href="http://www.xnoccio.com/wp-content/uploads/2010/05/xwiki_viafirma.png" target="_new"><img class="aligncenter size-full wp-image-1096" title="XWiki: logado en Viafirma" src="http://www.xnoccio.com/wp-content/uploads/2010/05/xwiki_viafirma.png" alt="" width="600" height="400" /></a></p>
<p>Finalmente veremos que ya estamos logados en XWiki (enhorabuena !!) :</p>
<p><a href="http://www.xnoccio.com/wp-content/uploads/2010/05/xwiki_loged1.png" target="_new"><img class="aligncenter size-full wp-image-1101" title="xwiki_loged" src="http://www.xnoccio.com/wp-content/uploads/2010/05/xwiki_loged1.png" alt="" width="600" height="400" /></a></p>
<p>Esto nos da por pensar en próximos capítulos: ¿publicación de contenidos firmados digitalmente? Quién sabe&#8230;</p>
<p>Un Saludo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/587-xwiki-autenticando-con-viafirma/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Esquema Nacional de Interoperabilidad</title>
		<link>http://www.xnoccio.com/es/549-esquema-nacional-de-interoperabilidad/</link>
		<comments>http://www.xnoccio.com/es/549-esquema-nacional-de-interoperabilidad/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 14:05:52 +0000</pubDate>
		<dc:creator>Manuel Navarro Almuedo</dc:creator>
				<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[accesibilidad]]></category>
		<category><![CDATA[estándares]]></category>
		<category><![CDATA[facturae]]></category>
		<category><![CDATA[tecnologia]]></category>

		<guid isPermaLink="false">http://xnoccio.com/549-esquema-nacional-de-interoperabilidad/</guid>
		<description><![CDATA[Podemos ver que hace ya unos días se ha publicado una regulación del Esquema Nacional de Interoperabilidad o de forma resumida ENI.
En él se recogen una serie de directrices que pretenden ser un conjunFto de normas o pautas a los que las Administraciones Públicas han de ajustarse con el objetivo de permitir y favorecer  la [...]]]></description>
			<content:encoded><![CDATA[<p>Podemos ver que hace ya unos días se ha publicado una regulación del Esquema Nacional de Interoperabilidad o de forma resumida ENI.</p>
<p>En él se recogen una serie de directrices que pretenden ser un conjunFto de normas o pautas a los que las Administraciones Públicas han de ajustarse con el objetivo de permitir y favorecer  la interoperabilidad entre los distintos sistemas de información dentro de la propia Administración.</p>
<p>Podeis ver una introducción <a href="http://www.csae.map.es/csi/pg5e41.htm" target="_new">AQUI </a></p>
<p>Y de forma más extendida en el <a href="http://www.csae.map.es/csi/pdf/Decreto_Interoperabilidad.pdf" target="_new">B.O.E. </a></p>
<p>Este Real Decreto no abandona una visión distribuida de los diferentes sistemas de información, donde cada Administración puede dar respuesta a determinados problemas que sólo surgen dentro de un ámbito muy concreto. Pero por otro lado puede ser muy útil para evitar la reinvención de la rueda, es decir, de soluciones que pueden ser aplicadas en distintas situaciones, algo muy común a día de hoy quizás por desconocimiento, quizás por &#8220;desorganización&#8221; dentro de la propia Administración.</p>
<p>Este texto apuesta claramente por una publicación vía electrónica de todos los servicios de la Admón. de forma organizada a través de Inventarios, gestionados por las Administraciones locales pero a su vez que se integren dentro de un Inventario a nivel Nacional, sin olvidar en ningún momento el aspecto Semántico de los diferentes servicios.</p>
<p>Se hace un guiño a favor del uso de estándares abiertos y de herramientas genéricas, pero a su vez, se puntualiza que se puedan usar otros con la finalidad de favorecer el acceso al ciudadano y el no estancamiento tecnológico.</p>
<p>La Firma y Certificados Electrónicos se ha convertido en una herramienta muy útil y funcional, y como no podía ser de otra forma encontramos un amplio apartado dedicado a esto aplicado a la relación entre sistemas consumidores y publicadores de los distintos servicios.</p>
<p>Sobre los Documentos Electrónicos, se hace referencia al almacenamiento y disponibilidad de dicho documento, siempre bajo unas reglas de seguridad sin pasar por alto la famosa LOPD, siguiendo las principios de integridad, autenticidad, confidencialidad, etc. Se habla también de los formatos en que ha de almacenarse los documentos y de la digitalización de los documentos en soporte papel.</p>
<p>Sin duda, vemos que éste es un texto bastante genérico y más que ser una enumeración de normas/estándares concretos, algo que sería cuanto menos utópico si hablamos a nivel nacional,  se trata de una apuesta y declaración de intenciones bastante condundente.</p>
<p>Después de haberle dedicado unos minutos a este texto y cuál sería su implicación a nivel autonómico, más concretamente en Andalucía, sin duda alguna se me viene a la cabeza una palabra: <a href="http://www.juntadeandalucia.es/xwiki/bin/view/MADEJA/ArqIntRecPlatina" target="_new">PLATINA</a>. Desde hace algún tiempo la Administración Andaluza ya viene observando la problemática de tener un batiburrillo de servicios muchas veces difícil de conectar entre si y viene apostando por esa plataforma como &#8220;anillo único para unirlos a todos&#8221;.</p>
<p>Sin duda, la interoperabilidad entre sistemas,  es un tema que quizás al inicio de los tiempos no se veía tan necesario, pero si no hemos abordado ya a día de hoy: ¡vamos tarde!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/549-esquema-nacional-de-interoperabilidad/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Redmine y Subversion (https): no actualiza las revisiones</title>
		<link>http://www.xnoccio.com/es/512-redmine-y-subversion-https-no-actualiza-las-revisiones/</link>
		<comments>http://www.xnoccio.com/es/512-redmine-y-subversion-https-no-actualiza-las-revisiones/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 13:28:19 +0000</pubDate>
		<dc:creator>Manuel Navarro Almuedo</dc:creator>
				<category><![CDATA[javahispano]]></category>
		<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://xnoccio.com/512-redmine-y-subversion-https-no-actualiza-las-revisiones/</guid>
		<description><![CDATA[Hola a todos,
supongo que todos conoceis la fabulosa funcionalidad que tiene Redmine respecto al acceso a un sistema de control de versiones de código fuente, como el caso que nos ocupa: Subversion. Permite consultar las diferentes revisiones, mostrando los distintos comentarios de cada revisión, permite acceder a la estructura en árbol de directorios, etc&#8230;
En la [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a todos,</p>
<p>supongo que todos conoceis la fabulosa funcionalidad que tiene <strong>Redmine </strong>respecto al acceso a un sistema de control de versiones de código fuente, como el caso que nos ocupa: <strong>Subversion</strong>. Permite consultar las diferentes <strong>revisiones</strong>, mostrando los distintos <strong>comentarios de cada revisión</strong>, permite acceder a la <strong>estructura en árbol de directorios</strong>, etc&#8230;</p>
<p>En la situación que os quiero comentar teníamos una instalación de <strong>Redmine </strong>totalmente funcional, con la conexión a <strong>Subversion</strong> funcionando a las mil maravillas, vía <strong>https</strong>. Sin embargo de un día para otro dentro de la pestaña &#8220;Repositorio&#8221; del proyecto dejamos de ver la estructura de carpetas y ya no se actualizan la información acerca de las sucesivas revisiones que se iban generando en el repositorio, pero sí se veían otras revisiones anteriores.</p>
<p>El primer paso fue mirar en el log de Redmine y se comprobó que se estaba generando un error bastante &#8220;inquietante&#8221;:</p>
<p><strong><em>Error parsing svn output: #&lt;REXML::ParseException: No close tag for /lists/list&gt;<br />
&#8230;./jruby/lib/ruby/1.8/rexml/parsers/treeparser.rb:27:in `parse&#8217;<br />
&#8230;./jruby/lib/ruby/1.8/rexml/document.rb:204:in `build&#8217;</em><br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br />
</strong></p>
<p>Tras esto, nos conectamos con un cliente subversion y comprobamos que el repositorio estaba totalmente operativo y las revisiones se estaban generando correctamente (incluso con los respectivos comentarios): ¿qué podrá estar pasando? (si quereis ir directo a la solución sólo id al final del post xD)</p>
<p>Como suele ser muy habitual investigamos acerca de la <strong>conexión https</strong> que se establece <strong>con Subversión</strong>, ya que en este caso Subversion se sirve vía https. Pues bien, nos dimos cuenta que el <strong>certificado del servidor</strong> (el que sirve Subversion)  estaba <strong>caducado</strong>: ¡¡ Eureka !!</p>
<p>Para solucionar esto simplemente actualizamos el certificado del servidor Subversion y volvimos a intentar de nuevo consultar la pestaña Repositorio de Redmine, pero no&#8230; sigue el mismo problema, no se actualizan las revisiones.</p>
<p>Tras poner nuestras neuronas a trabajar nos dimos cuenta que no habíamos introducido el <strong>nuevo certificado como &#8220;confiable&#8221; para Redmine</strong>&#8230; muy bien, pero ¿cómo hacer esto? Para explicar esto voy a comentar cómo Redmine se conecta con Subversion y obtiene toda esa metainformación que muestra (esto lo podemos ver en el código fuente de Subversion.rb correspondiente al adaptador de Subversion que tiene Redmine):</p>
<p>Redmine no hace más que ejecutar la orden &#8220;<strong>svn &#8211;xml list &lt;url_repositorio&gt;</strong>&#8221; y esto devuelve (o debería) un <strong>XML </strong>con toda la información, algo tan simple como eso ¿cómo puede dar problemas?</p>
<p>Nos disponemos a ejecutar esa misma orden de forma manual desde la máquina donde tenemos instalado Subversion y ¡sorpresa!: no nos retorna un XML correcto. A continuación, ejecutamos un simple comando de listado &#8220;<strong>svn list &lt;url_repositorio&gt;</strong>&#8221; y obtenemos un <strong>mensaje de aviso</strong>, preguntándonos si deseamos rechazar / aceptar de forma permanente o temporal el certificado de https://servidorSubversion . Por supuesto lo <strong>aceptamos de forma permanente </strong>(pulsando &#8216;P&#8217;)  y a continuación nos pidela contraseña del usuario logado en el sistema y usuario/contraseña de acceso a Subversion.</p>
<p>A partir de ahí todo debería funcionar, pero no: hay un pequeño detalle más. Debemos repetir el paso anterior ejecutando el comando &#8220;svn&#8221;con<strong> el mismo usuario que hace correr el servicio de Redmine</strong>. Parece que el cliente svn tiene un almacen de certificados &#8220;confiables&#8221; distinto para cada usuario que lo ejecuta.</p>
<p>Una vez hecho todo esto nuestro Redmine se conecta perfectamente con Subversion y obtiene toda la información actualizada.</p>
<p><strong>SOLUCION.- </strong>A continuación os resumo la solución con un par de pasos que se deben seguir, espero que os resulten útiles.</p>
<ol>
<li>Ejecutar por consola el comando &#8220;svn list &lt;url_subversion&gt;&#8221; en la máquina en que corre Redmine y con el mismo usuario que hace correr el servicio.</li>
<li>En el diálogo que se muestra: aceptar el certificado como confiable de manera permanente (&#8216;P&#8217;) e introducir los uusuarios/contraseñas que se solicitan.</li>
<li>Ejecutar por consola el comando &#8220;svn &#8211;xml list &lt;url_subversion&gt;&#8221; y comprobar ahora que sí nos devuelve un XML con todos los metadatos.</li>
<li>Comprobar que Redmine nos muestra ahora los datos correctos.</li>
</ol>
<p>Versión de Redmine utilizada: <strong>Redmine 0.8.0.stable</strong></p>
<p>Personalmente creo que este tipo de &#8220;errores&#8221; se deberían reportar de forma automática por parte de Redmine (mostrando una información más intuitiva) y es de esperar que en futuras versiones tomen en cuenta todos las numerosas incidencias que podeis ver en el bugtracker del proyecto Redmine respecto a este error.</p>
<p>Un Saludo a todos.<br />
Namaste y buena suerte.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/512-redmine-y-subversion-https-no-actualiza-las-revisiones/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nuevo cocktail: Windows Vista con una pizca de iTunes y Quicktime, precio recomendado “Error 46″</title>
		<link>http://www.xnoccio.com/es/343-nuevo-cocktail-windows-vista-con-una-pizca-de-itunes-y-quicktime-precio-recomendado-error-46/</link>
		<comments>http://www.xnoccio.com/es/343-nuevo-cocktail-windows-vista-con-una-pizca-de-itunes-y-quicktime-precio-recomendado-error-46/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 07:22:27 +0000</pubDate>
		<dc:creator>Manuel Navarro Almuedo</dc:creator>
				<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Frikadas]]></category>

		<guid isPermaLink="false">http://xnoccio.com/343-nuevo-cocktail-windows-vista-con-una-pizca-de-itunes-y-quicktime-precio-recomendado-error-46/</guid>
		<description><![CDATA[Hola buenas a tod@s,
esta vez os escribo para comentaros un quebradero de cabeza más que me ha dado Windows Vista e iTunes (con Quicktime), un par de problemas:
1) Cada vez que arranco el iTunes, se vuelve a reinstalar.
2) Se produce un error de ActiveX al abrir el Quick Time Player: Error 46
Para el primero de los [...]]]></description>
			<content:encoded><![CDATA[<p>Hola buenas a tod@s,</p>
<p>esta vez os escribo para comentaros un quebradero de cabeza más que me ha dado <a target="_new" href="http://www.microsoft.com/latam/windows/products/windowsvista/">Windows Vista</a> e <a target="_new" href="http://www.apple.com/es/itunes/">iTunes</a> (con Quicktime), un par de problemas:</p>
<p><strong>1) </strong>Cada vez que arranco el iTunes, se vuelve a reinstalar.</p>
<p><strong>2)</strong> Se produce un error de ActiveX al abrir el Quick Time Player: Error 46</p>
<p>Para <strong>el primero de los problemas</strong>, la solución fue un poco drástica: eliminar el acceso directo del iTunes que tenemos en el Escritorio y crear un nuevo acceso directo al iTunes.exe que tenemos en nuestra carpeta de &#8220;%Program Files%/iTunes&#8221;, lo colocamos en nuestro Escritorio y aquí no ha pasado nada <img src='http://www.xnoccio.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>Para <strong>solucionar el segundo error</strong> ya tenemos que hacer un par de cosillas más.</p>
<p>Primero os comento cuál es la causa de este error:<br />
Parece ser que al instalar QuickTime Player las claves introducidas en el registro  de Windows Vista no adquieren permisos de acceso correctos. Exactamente lo que ocurre es que nuestro usuario (sea Administrador o no) no tiene acceso ni siquiera de lectura a dichas claves.</p>
<p>Esto os lo cuento yo y queda muy bonito ¿verdad?, pero ¿cómo podeis comprobar esto vosotros mismos?<br />
Pues descárguense el programa <a target="_new" href="http://www.microsoft.com/latam/technet/sysinternals/SystemInformation/processmonitor.mspx">Process Monitor</a>  de Microsoft. Tras instalarlo y dejar abierta la aplicación, intenten abrir QTPlayer y miren los errores que se muestran en el Proces Monitor producen al intentar abrir el QuickTime Player, seguro les aparecerá &#8220;ACCESS DENIED&#8221; a distintas claves del registro (podeis filtrar las lineas que se muestran).</p>
<p>Pues bien, parece que tenemos claro ahora cuál es el problema, <strong>¿cómo &#8220;repcuperar&#8221; los permisos de lectura sobre dichas claves?</strong></p>
<p>Si hacemos lo típico, ejecutar &#8220;<strong>regedit</strong>&#8221; e intentar modificar los permisos manualmente veremos que no tenemos autorización para realizar estos cambios en esas claves afectadas.<strong> ¡Vaya chasco!</strong></p>
<p>Bien, busquemos otra forma de modificar estos permisos. Usemos ahora otro programa de Microsoft llamado<strong> <a target="_new" href="http://go.microsoft.com/fwlink/?LinkId=23418">SubInACL</a></strong>: esta es una herramienta de administración, para modificar y consultar distintos parámetros del sistema como claves del registro, servicios, etc., pero vamos al grano.</p>
<p>Con este programa tenemos ahora que modificar los permisos asignados a estas claves que no pudimos modificar con &#8220;regedit.exe&#8221; .</p>
<p>Una vez descargado e instalado, debemos copiar el script que contiene <a href="http://www.xnoccio.com/wp-content/uploads/2008/08/script1.zip" title="Script.zip">Script.zip</a> y descomprimir el .cmd en la carpeta&#8221;<strong>%Program Files%\Windows Resource Kits\Tools</strong>&#8220;, que es donde se debe haber instalado SubInACL.<br />
Este script es parecido a otros que aparecen en algunos foros, pero este en concreto contiene algunas correcciones realizadas por mi y adaptado a Windows Vista en Español, no en Inglés. Recomiendo hacer una copia de seguridad del registro antes de ejecutar nada, siempre es conveniente trabajar sobre seguro.</p>
<p>A continuación, abramos una <strong>terminal de consola</strong> (Inicio / Ejecutar / cmd.exe para los no iniciados) y vayamos a la carpeta donde copiamos el script. Ejecutemos en la consola &#8220;<strong>resetSpanish.cmd</strong>&#8221; y veamos en el log mostrado que no salgan errores:<br />
<em><br />
Done:        X, Modified        X, Failed        0, Syntax errors        0<br />
</em></p>
<p>lo importante es que &#8220;Failed&#8221;  y &#8220;Syntax errors&#8221; salgan a cero.</p>
<p>Este script hay que lanzarlo con un <strong>usuario Administrador</strong> <strong>y </strong>recomiendo <strong>desactivar el sistema de protección de cuentas</strong> de que dispone Windows Vista (Panel de Control / Cuentas de Usuario / Activar o desactivar el control de cuentas de usuario),<br />
una vez lanzado el script podeis volverlo a activar.</p>
<p>Una vez hecho esto, podremos abrir &#8220;QuickTime Player&#8221; sin obtener el dichoso error 46.</p>
<p><em><strong>Y recordad: siempre tenemos una alternativa en LINUX &#8230;</strong></em></p>
<p>Namasté.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/343-nuevo-cocktail-windows-vista-con-una-pizca-de-itunes-y-quicktime-precio-recomendado-error-46/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Webservice-client con Metro JAX-WS y Autenticación Básica</title>
		<link>http://www.xnoccio.com/es/318-webservices-con-metro-jax-ws-y-autenticacion-basica/</link>
		<comments>http://www.xnoccio.com/es/318-webservices-con-metro-jax-ws-y-autenticacion-basica/#comments</comments>
		<pubDate>Sat, 07 Jun 2008 19:26:08 +0000</pubDate>
		<dc:creator>Manuel Navarro Almuedo</dc:creator>
				<category><![CDATA[javahispano]]></category>
		<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://xnoccio.com/318-webservices-con-metro-jax-ws-y-autenticacion-basica/</guid>
		<description><![CDATA[En esta ocasión os voy a comentar cómo generar un cliente de un webService con autenticación básica (usuario/contraseña , Basic Authentication) usando el plugin para maven JAX-WS.
Doy por hecho que todos sabeis cómo integrar este plugin con maven, podeis obtener toda la información necesaria sobre este plugin en su página oficial.
Al final tendremos algo parecido [...]]]></description>
			<content:encoded><![CDATA[<p>En esta ocasión os voy a comentar cómo generar un cliente de un webService con autenticación básica (usuario/contraseña , Basic Authentication) usando el plugin para maven JAX-WS.<br />
Doy por hecho que todos sabeis cómo integrar este plugin con maven, podeis obtener toda la información necesaria sobre este plugin en su <a href="https://jax-ws.dev.java.net/" target="_new">página oficial</a>.</p>
<p>Al final tendremos algo parecido a esto, introduciendo una nueva entrada en la lista de plugins:</p>
<p>&lt;plugin&gt;<br />
&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;<br />
&lt;artifactId&gt;jaxws-maven-plugin&lt;/artifactId&gt;<br />
&lt;executions&gt;<br />
&lt;execution&gt;<br />
&lt;phase&gt;process-sources&lt;/phase&gt;<br />
&lt;goals&gt;<br />
&lt;goal&gt;wsimport&lt;/goal&gt;<br />
&lt;/goals&gt;<br />
&lt;/execution&gt;<br />
&lt;/executions&gt;<br />
&lt;configuration&gt;<br />
&#8230;&#8230;<br />
&lt;/configuration&gt;<br />
&lt;dependencies&gt;<br />
&#8230; lista de dependencias del plugin &#8230;<br />
&lt;/dependencies&gt;<br />
&lt;/plugin&gt;</p>
<p>Para el caso que nos ocupa, vamos a suponer que tenemos un WSDL (<a href="http://es.wikipedia.org/wiki/WSDL" target="_new"><strong>Web Services Description Language</strong></a>) desplegado en un servidor que requiere Usuario y Contraseña, <strong>¿cómo podemos indicarle a este plugin la URL al fichero descriptor del servicio web? ¿cómo le indicamos el usuario y contraseña?</strong><br />
Pues todo esto se hace en la sección &#8220;<strong>configuration</strong>&#8220;.<br />
Tenemos mucha documentación disponible la web relacionada con <a href="https://jax-ws-commons.dev.java.net/jaxws-maven-plugin/wsimport-mojo.html" target="_new"><strong>wsimport</strong></a>.</p>
<p>Un sabio amigo mío se quejaba una vez en clase de programación, diciendo que la programación era como <a href="http://www.karlosnet.com/General/receta.php?c=1559" target="_new"><strong>empanar filetes</strong></a>, y que no le podían enseñar a hacer filetes empanados si antes no se había comido ninguno. Pues bien, siguiendo esta corriente filosófica os pongo un ejemplo y os comento después las secciones que nos afectan:<br />
&lt;configuration&gt;<br />
&lt;wsdlUrls&gt;<br />
&lt;wsdlUrl&gt;[http/https]://[servidor1]:[puerto1]/[rutaAlDescriptor1]?wsdl&lt;/wsdlUrl&gt;<br />
&lt;wsdlUrl&gt;[http/https]://[servidor2]:[puerto2]/[rutaAlDescriptor2]?wsdl&lt;/wsdlUrl&gt;<br />
&lt;/wsdlUrls&gt;<br />
&lt;packageName&gt;mipaquete.ws.client&lt;/packageName&gt;<br />
&lt;sourceDestDir&gt;${basedir}/src/main/java&lt;/sourceDestDir&gt;<br />
&lt;verbose&gt;true&lt;/verbose&gt;<br />
&lt;extension&gt;true&lt;/extension&gt;<br />
&lt;xadditionalHeaders&gt;true&lt;/xadditionalHeaders&gt;<br />
&lt;xdebug&gt;true&lt;/xdebug&gt;<br />
&lt;xauthFile&gt;${basedir}/src/site/resources/auth.conf&lt;/xauthFile&gt;<br />
&lt;/configuration&gt;</p>
<p>En primer lugar definimos una lista de URL a los distintos ficheros descriptores y posteriormente el paquete en el que generarán las clases consumidoras del servicio web.<br />
Otro parámetro importante en el caso que nos ocupa es &#8220;xauthFile&#8221;. Este parámetro le indica al plugin una ruta a un fichero, en dicho fichero se almacena el Usuario/Contraseña de acceso a la lista de wsld&#8217;s anterior.</p>
<p>Este fichero debe contener una serie de lineas de la siguiente manera:<br />
[http/https]://[usuario]:[contraseña]@[servidor]:[puerto]/[rutaAlDescriptor]?wsdl</p>
<p>Tantas líneas como se requieran según las URL&#8217;s indicadas en &#8220;wsdlUrls&#8221;.</p>
<p>Pues bien, si generamos a continuación las clases, nuestro plugin le pedirá a los servidores los distintos wslds&#8217;s y se autenticará correctamente usando el fichero auth.conf.</p>
<p><strong>¿Hemos acabado ya?</strong><br />
Pues hemos hecho la mitad, por ahora lo que tenemos es una serie de clases que pueden consumir los distintos servicios web.</p>
<p><strong>Pregunta, ¿Se volverá a requerir Usuario/Contraseña cuando se invoque a unos de estos métodos clientes del servicio web?</strong><br />
Pues sí.</p>
<p><strong>¿Y se supone que ese usuario y contraseña lo coge del fichero de autenticación anterior?</strong><br />
Pues no, este fichero sólo nos ha servido para generar las clases clientes, nada más.</p>
<p>Entonces, un <strong>segundo paso</strong> es introducir un sistema de autenticación dentro de nuestro cliente, ¡vamos a ello!</p>
<p>Una de las posibles opciones es generar una clase de autenticación, que extienda de &#8220;java.net.Authenticator&#8221;.<br />
Su implementación es bastante simple, os pongo un ejemplo:</p>
<p><code><br />
import java.net.Authenticator;<br />
import java.net.PasswordAuthentication;</code></p>
<p>public class MiAutenticador extends Authenticator {<br />
static final String user = &#8220;miNombreDeUsuario&#8221;; // Login<br />
static final String pass = &#8220;miContraseña&#8221;; // Password</p>
<p>public PasswordAuthentication getPasswordAuthentication() {<br />
return (new PasswordAuthentication(user, pass.toCharArray()));<br />
}<br />
}</p>
<p>Creo que no merece más comentarios, sólo indicar que los atributos &#8220;user&#8221; y &#8220;pass&#8221; deberían leerse de un fichero de propiedades por ejemplo, pero de ninguna manera deberían estar a fuego en nuestro código.</p>
<p>Ahora que tenemos nuestra clase de autenticación <strong>¿cómo &#8220;conectarla&#8221; en nuestras clases clientes?</strong><br />
Pues bien, lo que debemos hacer es indicar que deseamos usar este &#8220;Autenticador&#8221; justo antes de la llamada al<br />
webService que requiere dicha autenticación, algo como:<br />
<code><br />
........<br />
Authenticator.setDefault(new MiAutenticador());<br />
API_webService.metodo(params);<br />
........<br />
</code></p>
<p>Esto se puede implementar de manera elegante usando el patrón de Diseño Decorador (<a href="http://es.wikipedia.org/wiki/Decorator" target="_new">Decorator Pattern</a> ), de manera que por defecto se &#8220;decore&#8221; los distintos métodos del api webService con nuestro autenticador.</p>
<p>Pues nada más, espero haber sido claro.</p>
<p>Gracias, namasté y buena suerte.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/318-webservices-con-metro-jax-ws-y-autenticacion-basica/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bienvenido a la iniciativa Dharma</title>
		<link>http://www.xnoccio.com/es/317-bienvenido-a-la-iniciativa-dharma/</link>
		<comments>http://www.xnoccio.com/es/317-bienvenido-a-la-iniciativa-dharma/#comments</comments>
		<pubDate>Mon, 26 May 2008 07:02:25 +0000</pubDate>
		<dc:creator>Manuel Navarro Almuedo</dc:creator>
				<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[Frikadas]]></category>

		<guid isPermaLink="false">http://xnoccio.com/317-bienvenido-a-la-iniciativa-dharma/</guid>
		<description><![CDATA[Creo que aquí no soy el único que se siente realmente atraído por la serie Lost.
La Red ya se encuentra repleta de miles de críticas acerca de esta serie y de muchas indagaciones acerca de toda la simbología que aparece durante todo el desarrollo de la intrigante y desconcertante trama.
Una de estas inquietantes relaciones es la que [...]]]></description>
			<content:encoded><![CDATA[<p>Creo que aquí no soy el único que se siente realmente atraído por la serie <a target="_new" href="http://es.wikipedia.org/wiki/4815162342" title="Enlace a Lost en la wikipedia">Lost</a>.<br />
La Red ya se encuentra repleta de miles de críticas acerca de esta serie y de muchas indagaciones acerca de toda la simbología que aparece durante todo el desarrollo de la intrigante y desconcertante trama.</p>
<p>Una de estas inquietantes relaciones es la que podemos observar en el logo de la Corporación Dharma con la iconografía de una corriente filosófica oriental conocida como &#8220;Bagua&#8221;, pero como digo, ya hay <a target="_new" href="http://www.lostpedia.com/wiki/DHARMA_logos" title="DHARMA Logos en wikipedia">mucho contenido en la red</a> acerca de esto.</p>
<p>Después de todo esto lo que quiero es contaros cómo podemos hacer más atractiva, para nosotros los Lostadictos, la imagen con la que se inicia el <a target="_new" href="http://www.eclipse.org/" title="http://www.eclipse.org/">IDE de Eclipse</a>, es bien simple.</p>
<p>En la carpeta donde tenemos instalado/desplegado nuestro Eclipse tenemos que irnos a:</p>
<p>plugins\org.eclipse.platform_3.3.2.R33x_v20071022</p>
<p>aunque dependiendo de nuestra versión puede ser distinta.</p>
<p>En cualquier caso lo que tenemos que hacer es sustituir el archivo splash.bmp, que es el que se usa durante el inicio de Eclipse y poner en su lugar este otro:</p>
<p><img align="middle" width="455" src="http://www.xnoccio.com/wp-content/uploads/2008/05/splash1.bmp" alt="Logo Eclipse Dharma" height="295" style="width: 455px; height: 295px" title="Logo Eclipse Dharma" /> </p>
<p><a target="_new" href="http://img98.imageshack.us/my.php?image=splashrm1.png"></a></p>
<p><a href="http://img604.imageshack.us/content.php?page=blogpost&amp;files=img98/2160/splashrm1.png" title="QuickPost"></a></p>
<p>Así cada vez que tengamos que arrancar el IDE se nos vendrá a la mente todos los personales que habitan en la Isla: Benjamin Linus, Jhon Lock, Jack Shephard&#8230; la Corporación Dharma&#8230;</p>
<p><em>Muchas gracias, namaste y buena suerte.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/317-bienvenido-a-la-iniciativa-dharma/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Java: Implementación de una caché con Referencias Débiles</title>
		<link>http://www.xnoccio.com/es/306-java-implementacion-de-una-cache-con-referencias-debiles/</link>
		<comments>http://www.xnoccio.com/es/306-java-implementacion-de-una-cache-con-referencias-debiles/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 11:10:05 +0000</pubDate>
		<dc:creator>Manuel Navarro Almuedo</dc:creator>
				<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://xnoccio.com/306-java-implementacion-de-una-cache-con-referencias-debiles/</guid>
		<description><![CDATA[Últimamente me ha surgido una necesidad que hasta ahora no se me había presentado.
Os comento de qué se trata:
Estaba desarrollando una aplicación web (jsf, seam, etc.), en unos de las páginas se generaba un listado en el que se muestra datos sobre una serie de documentos.
Existe la posibilidad de descargar estos documentos, que no son [...]]]></description>
			<content:encoded><![CDATA[<p>Últimamente me ha surgido una necesidad que hasta ahora no se me había presentado.<br />
Os comento de qué se trata:</p>
<p>Estaba desarrollando una aplicación web (jsf, seam, etc.), en unos de las páginas se generaba un listado en el que se muestra datos sobre una serie de documentos.</p>
<p>Existe la posibilidad de descargar estos documentos, que no son más que archivos pdfs, a través de una aplicación cliente que a su vez se despliega con Java Web Start con JNLP en la misma aplicación web.<br />
El problema es el siguiente:</p>
<p>El usuario X a través de la aplicación ve el listado, pero el JNLP no comparte la misma sesión que el navegador, luego no podemos acceder a dicho listado, ya que se trata de un objeto visible en el conexto Sesión.<br />
Una primera solución consistiría en pasar los distintos identificadores de los documentos listados al JNLP a través de parámetros en la URL. Pero existe el problema de que el listado sea demasiado largo y la URL resultante sea demasiado larga, problema con caracteres no aptos para una URL, etc.  Podemos jugárnosla, optar por esta &#8220;solución&#8221; y rezar para que nunca se produzca esa situación&#8230; no mola, sigamos pensando y busquemos otra solución.<br />
Posteriormente podemos pensar en identificar el listado y mantener los elementos relacionados en una caché. Caché que no se alojará a nivel de Sesión, sino en el conexto de la Aplicación (ServletContext), para que esté visible desde todas las sesiones (usuario web y usuario jnlp).</p>
<p>Pero, ¿cómo implementamos esta caché?<br />
Usemos un simple HashMap:</p>
<p>El primer usuario entra, hace un listado, se introduce en la caché el listado.<br />
El mismo usuario genera otro listado, se introduce en la caché.<br />
Entra otro usuario, lo mismo, un nuevo elemento a la caché.<br />
Trás introducir cinco mil elementos en la caché vemos que la aplicación ya no puede más y dice &#8216;¡¡ hasta aquí hemos llegado !!&#8217;.<br />
¿Qué ha pasado? Pues que la caché ha almacenado muchísimos listados y se ha &#8216;comido&#8217; muchísima memoria.</p>
<p>¿Cómo podríamos solucionarlo? Establezcamos un tamaño máximo de cacheo, lo que nos llevará a proponer una determinada política de reemplazo (aleatoria, LRU, LFU, FIfo). Demasiadas cosas para pensar, y teniendo en cuenta las leyes de Murphy &#8216;Si algo puede fallar, fallará&#8217;, así que mejor sigo investigando otra forma de implementar la caché.</p>
<p>Y ¿se podría implementar la caché de tal forma que el recolector de basura de Java vaya borrando sus elementos cuando se esté consumiento demasiada memoria? Esto nos lleva al concepto de &#8220;Referencia débil&#8221;.</p>
<p>Recordemos los tipos de referencias en Java: Fuertes, débiles, blandas y fantasma. En la práctica las débiles y las blandas son tratadas igual por la Máquina Virtual Java (no sigo explicando esto porque no es el objetivo de este post).</p>
<p>Cuando el recolector de basura se ejecuta y va recorriendo los distintos objetos, si estos objetos son apuntados por referencias débiles se eliminan, tal y como suena, esto no ocurre con las referencias fuertes.<br />
¿Cómo podemos aprovechar esto en nuestra caché? Pues a través de la clase WeakHashMap (véase java.util.WeakHashMap). Esta clase implementa java.util.Map, pero las keys se almacenan como objetos con referencias débiles. Con esto se dejará la responsabilidad de vaciar la caché al recolector de basura.<br />
Pues nada más, con esto hemos conseguido implementar una caché visible desde las distintas sesiones en una aplicación y gestionada por el Recolector de Basura.</p>
<p>A continuación os pongo un pequeño código de ejemplo para que podais ver la diferencia de funcionamiento entre un HashMap y un WeakHashMap.</p>
<pre><code>import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;

public class Prueba {
	public static void main(String[] args) {
		Map map = new HashMap();
		Map weakMap = new WeakHashMap();
		imprime("map", map);
		imprime("weakMap", weakMap);
		for (int i = 0; i &lt; 50; i++) {
			System.out.println("=======================n=======================");
			System.out.println("Insertando: " + i);
			System.out.println("Insertando: " + i + "_key");
			map.put("" + i, "" + i);
			map.put("" + i + "_key", "" + i);
			weakMap.put("" + i, "" + i);
			weakMap.put("" + i + "_key", "" + i);
			imprime("map", map);
			imprime("weakMap", weakMap);
			if (map.keySet().size() != weakMap.keySet().size()) {
				System.out.println("DISTINTO TAMAÑO !!!");
			}
			System.out.println("Eliminando: " + i);
			map.remove("" + i);
			weakMap.remove("" + i);
			imprime("map", map);
			imprime("weakMap", weakMap);
		}
	}

	private static void imprime(String texto, Map map) {
		System.out.println("n-----------" + texto + "-----------");
		System.out.println("Size: " + map.keySet().size());
		System.out.println("Map:" + map);
		System.out.println("------------------------------n");
	}
}</code></pre>
<p>Por cierto, quien quiera seguir investigando las referencias débiles puede probar con la clase java.lang.ref.WeakReference.</p>
<p>Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/306-java-implementacion-de-una-cache-con-referencias-debiles/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Framework Seam: autorización en aplicaciones</title>
		<link>http://www.xnoccio.com/es/286-framework-seam-autorizacion-en-aplicaciones/</link>
		<comments>http://www.xnoccio.com/es/286-framework-seam-autorizacion-en-aplicaciones/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 14:31:43 +0000</pubDate>
		<dc:creator>Manuel Navarro Almuedo</dc:creator>
				<category><![CDATA[xnoccio]]></category>
		<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://xnoccio.com/286-framework-seam-autorizacion-en-aplicaciones/</guid>
		<description><![CDATA[Como todos ya sabemos uno de los puntos importantes de una aplicación web es el control de la seguridad en cuanto a la autenticación y la autorización de usuarios.
Básicamente a la Autenticación le corresponde la tarea de ver quién es el usuario y a la Autorización le corresponde permitir o no el acceso a las [...]]]></description>
			<content:encoded><![CDATA[<p>Como todos ya sabemos uno de los puntos importantes de una aplicación web es el control de la seguridad en cuanto a la autenticación y la autorización de usuarios.</p>
<p>Básicamente a la Autenticación le corresponde la tarea de ver quién es el usuario y a la Autorización le corresponde permitir o no el acceso a las distintas zonas de una aplicación web a partir, por ejemplo, de su perfil en la aplicación.</p>
<p>En este post me centraré en la Autorización, ya que Jboss Seam tiene mucho que decir al respecto, y os muestro una posible implementación para controlar el acceso de un usuario a una &#8220;zona&#8221; determinada de una aplicación.</p>
<p>Supongamos una aplicación con dos zonas, una zona de administración y una zona de acceso a usuarios. Para la primera zona (<a href="http://&lt;aplicacion&gt;/admin">http://&lt;aplicacion&gt;/admin</a>) se necesita que el usuario posea el rol &#8220;admin&#8221;, mientras que para la segunda(<a href="http://&lt;aplicacion&gt;/usuario">http://&lt;aplicacion&gt;/usuario</a>) el rol &#8220;usuario&#8221;, nos centraremos en la primera, la segunda os la dejo como ejercicio&#8230;<br />
También supongamos que tenemos un objeto &#8220;authenticator&#8221; que implementa los distintos métodos que requiere Seam respectos a la autenticación.<br />
Normalmente, cuando un usuario entra en la aplicación sin haberse logado Seam lanza la excepción &#8220;NotLoggedInException&#8221; y posteriormente se redirige al usuario a la correspondiente pantalla para logarse. Este comportamiento se controla mediante el archivo &#8220;pages.xml&#8221;:<br />
&lt;exception class=&#8221;<strong>org.jboss.seam.security.NotLoggedInException</strong>&#8220;&gt;<br />
&lt;redirect view-id=&#8221;<strong>/index.xhtml</strong>&#8220;&gt;<br />
&lt;message&gt;<strong>Usted debe estar logado para acceder a esta página.</strong>&lt;/message&gt;<br />
&lt;/redirect&gt;<br />
&lt;/exception&gt;</p>
<p>Tras introducir los datos para el login (usuario y contraseña, certificado digital, etc.), el método &#8220;returnTo&#8221; del &#8220;autenticator&#8221; nos redirige a la zona adecuada, según observemos el rol que tiene asignado el usuario, esto lo podemos indicar en el fichero &#8220;components.xml&#8221;:<br />
&lt;event type=&#8221;<strong>org.jboss.seam.postAuthenticate</strong>&#8220;&gt;<br />
&lt;action execute=&#8221;<strong>#{authenticator.returnTo}</strong>&#8220;/&gt;<br />
&lt;/event&gt;</p>
<p>Una primera propuesta (adelanto que no es la definitiva), para controlar el acceso a la zona &#8220;admin&#8221; podríamos definir en el pages.xml lo siguiente:</p>
<p>&lt;page  view-id=&#8221;<strong>/admin/*</strong>&#8221; login-required=&#8221;true&#8221;&gt;<br />
&lt;restrict&gt;<strong>#{s:hasRole(&#8216;admin&#8217;)}</strong>&lt;/restrict&gt;<br />
&lt;/page&gt;</p>
<p>&lt;exception class=&#8221;<strong>org.jboss.seam.security.AuthorizationException</strong>&#8220;&gt;<br />
&lt;end-conversation/&gt;<br />
&lt;redirect view-id=&#8221;<strong>/index.xhtml</strong>&#8220;&gt;<br />
&lt;message&gt;<strong>Usted no posee los privilegios suficientes para acceder a esta zona.</strong>&lt;/message&gt;<br />
&lt;/redirect&gt;<br />
&lt;/exception&gt;</p>
<p>Que en Castellano significa: para las peticiones a &#8220;/admin/*&#8221; comprueba que el usuario tiene el rol &#8220;admin&#8221;. Cuando no lo tenga se lanzará la correpondiente excepción &#8220;AuthorizationException&#8221; y se le redirigirá a &#8220;/index.xhtml&#8221; mostrándose el mensaje &#8220;Usted no posee los privilegios suficientes para acceder a esta zona.&#8221;</p>
<p>Quizás si no vamos más allá podamos pensar que tenemos todo controlado, pero ahora<strong> imaginemos la siguiente situación</strong>:</p>
<p>1) Un usuario entra en la aplicación, se va a la página de Login (por el NotLoggedInException capturado) y se loga correctamente, sin rol &#8220;admin&#8221; por lo que no debería tener acceso a /admin, de hecho el &#8220;return True&#8221; le redirige a la zona pública.<br />
2) El usuario que se cree un piratilla escribe a fuego en la barra de direcciones del navegador &#8220;/admin&#8221; y le da al botón de Enter&#8230;</p>
<p><strong>¿Qué pasará?</strong><br />
Lo esperado es que si el usuario pide &#8220;manualmente&#8221; en /admin tras logarse y obtener únicamente el rol &#8220;usuario&#8221;, la aplicación genera un AuthorizationException y se le redirigirá a /index.xhtml (pantalla inicial de bienvenida)&#8230;<br />
Hazlo y comprobarás que no&#8230; el usuario tiene acceso a la zona de administración.</p>
<p><strong>¿Y porqué?</strong> Pues una de las causas que he leído en el foro de jboss es que &#8220;esa excepción no se trata en la fase de render del JSF&#8221; y entonces no tiene el comportamiento que se indica en el pages.xml. Quizás no haya que buscar más porqués y proponer otra solución.<br />
Una <strong>segunda propuesta</strong>, bastante atractiva aunque después propondré otra ligeramente más refinada, trata de que la aplicación capture correctamente la excepción AuthorizationException, nos redirija al index.xhtml y no suponga tener que redefinir arquitectura de ningún tipo&#8230; allá va:<br />
Deberemos crear un nuevo &#8220;Controller&#8221; como este, especialmente dedicado a controlar el acceso a la zona de administración, quizás se podría usar cualquier controller ya existente, pero así queda más limpito nuestro código (vease &#8220;asignación de responsabilidades&#8221;):<br />
@Name(&#8220;authorizationAdminController&#8221;)<br />
@Scope(CONVERSATION)<br />
<strong>@Restrict(&#8220;#{s:hasRole(&#8216;admin&#8217;)}&#8221;)</strong><br />
public class <strong>AuthorizationAdminController</strong> extends ControllerJsfApplication {<br />
public void forceCheckAdminAuthorization(){}<br />
}</p>
<p>Vemos que queda un controller práctiamente vacío.<br />
Debido a @Restrict sólo podrán &#8220;invocar&#8221; a este controller los Identities(usuarios logados) con rol &#8220;admin&#8221;.</p>
<p>Ahora modificamos nuestro pages.xml de la siguiente forma:<br />
Donde antes teníamos:<br />
&lt;page  view-id=&#8221;/admin/*&#8221; login-required=&#8221;true&#8221;&gt;<br />
&lt;restrict&gt;#{s:hasRole(&#8216;admin&#8217;)}&lt;/restrict&gt;<br />
&lt;/page&gt;</p>
<p>Ahora tenemos:<br />
&lt;page  view-id=&#8221;<strong>/admin/*</strong>&#8221; login-required=&#8221;true&#8221; action=&#8221;<strong>#authorizationAdminController.forceCheckAdminAuthorization}</strong>&#8220;&gt;<br />
&lt;/page&gt;<br />
Con lo que al hacer una petición a &#8220;/admin&#8221; se ejecutará el action ( authorizationAdminController.forceCheckAdminAuthorization ), el cual no podrá estar accesible si no se posee el rol &#8220;admin&#8221;, debido a la anotación @Restrict del controller. Si el identity no posee este rol se lanza AuthorizationException, igual que pasaba antes sin usar el controller, sólo que ahora esta excepción si se captura correctamente y se realiza la redirección indicada en el pages.xml.<br />
También deberemos mantener:<br />
&lt;exception class=&#8221;org.jboss.seam.security.AuthorizationException&#8221;&gt;<br />
&lt;end-conversation/&gt;<br />
&lt;redirect view-id=&#8221;/index.xhtml&#8221;&gt;<br />
&lt;message&gt;Usted no posee los privilegios suficientes para acceder a esta zona.&lt;/message&gt;<br />
&lt;/redirect&gt;<br />
&lt;/exception&gt;<br />
Con esta modificación conseguimos proteger correctamente la zona &#8220;/admin&#8221;, un usuario que intente logarse y posteriormente entrar en &#8220;/admin&#8221;, esta vez se le mostrará el index.xhtml con el mensaje: &#8220;Usted no posee los privilegios suficientes para acceder a esta zona.&#8221;<br />
Una <strong>tercera solución</strong> es simplemente un refinamiento de la segunda, y llegamos a ella a través de la pregunta:<br />
Si tenemos 50 zonas de protegidas, ¿tendremos que implementar 50 Controller semejantes a &#8220;AuthorizationAdminController&#8221; pero con un @Restrict distinto?<br />
Pues no, la solución está en no anotar el Controller con @Restrict, sino anotar el propio método, así podríamos tener un único controller y N métodos para comprobar distintas autorizaciones:</p>
<p>@Name(&#8220;authorizationAdminController&#8221;)<br />
@Scope(CONVERSATION)<br />
public class AuthorizationAdminController extends ControllerJsfApplication {</p>
<p>@Restrict(&#8220;#{s:hasRole(&#8216;admin&#8217;)}&#8221;)<br />
public void forceCheckAdminAuthorization(){}</p>
<p>@Restrict(&#8220;#{s:hasRole(&#8216;usuario&#8217;)}&#8221;)<br />
public void forceCheckUsuarioAuthorization(){}</p>
<p>&#8230;&#8230;&#8230;</p>
<p>@Restrict(&#8220;#{s:hasRole(&#8216;XXXX&#8217;)}&#8221;)<br />
public void forceCheckXXXXXXXAuthorization(){}</p>
<p>}</p>
<p>Indicando en el pages.xml el método &#8220;forceCheck X Authorization&#8221; que corresponde a cada zona las protegeremos convenientemente.</p>
<p>Pues con esto ha acabado lo que ha intentado ser una explicación.</p>
<p>Nunca olvidaré esta &#8220;primera vez&#8221; en que escribí en xnoccio, espero que hallais disfrutado tanto como yo.</p>
<p>Que la suerte os acompañe !!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xnoccio.com/es/286-framework-seam-autorizacion-en-aplicaciones/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
	</channel>
</rss>

