<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Techiblog's Blog</title>
	<atom:link href="http://techiblog.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://techiblog.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Tue, 26 Jan 2010 10:00:35 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='techiblog.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Techiblog's Blog</title>
		<link>http://techiblog.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://techiblog.wordpress.com/osd.xml" title="Techiblog&#039;s Blog" />
	<atom:link rel='hub' href='http://techiblog.wordpress.com/?pushpress=hub'/>
		<item>
		<title>DirXML Queries</title>
		<link>http://techiblog.wordpress.com/2010/01/26/dirxml-queries/</link>
		<comments>http://techiblog.wordpress.com/2010/01/26/dirxml-queries/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 09:59:24 +0000</pubDate>
		<dc:creator>techiblog</dc:creator>
				<category><![CDATA[DirXML]]></category>
		<category><![CDATA[eDirectory]]></category>
		<category><![CDATA[Gestión de Identidades]]></category>
		<category><![CDATA[Gestión de Identidades Novell]]></category>
		<category><![CDATA[ldap]]></category>

		<guid isPermaLink="false">http://techiblog.wordpress.com/?p=58</guid>
		<description><![CDATA[La función query nos permite realizar consultas tanto al repositorio de destino como al de origen de objetos según un criterio de búsqueda. Para usarlo declaramos una variable que contendrá el resultado de la búsqueda y le asignamos la función query donde definimos el repositorio donde queremos realizar la búsqueda , el atributo de búsqueda [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=58&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">La función query nos permite realizar consultas tanto al repositorio de destino como al de origen de objetos según un criterio de búsqueda. Para usarlo declaramos una variable que contendrá el resultado de la búsqueda y le asignamos la función query donde definimos el repositorio donde queremos realizar la búsqueda , el atributo de búsqueda ( match attribute ) y los atributos que queremos consultar de los objetos que cumplan con las condiciones de búsqueda.</p>
<p style="text-align:center;"><a href="http://techiblog.files.wordpress.com/2010/01/query.jpg"><img class="size-medium wp-image-59 aligncenter" title="query" src="http://techiblog.files.wordpress.com/2010/01/query.jpg?w=443&#038;h=164" alt="" width="443" height="164"></a></p>
<p style="text-align:justify;"><i>Captura en designer con la declaración de la variable y el objecto query</i><br />
Ahora nos quedará por definir las propiedades de búsqueda como se puede ver en la siguiente captura , en este ejemplo buscamos en origen ( metadirecotry ) un objeto usuario de nombre alfredo ( cn = alfredo ) y queremos obtener su apellido y su dirección de email</p>
<p style="text-align:center;"><a href="http://techiblog.files.wordpress.com/2010/01/query2.jpg"><img class="size-medium wp-image-61 aligncenter" title="query2" src="http://techiblog.files.wordpress.com/2010/01/query2.jpg?w=319&#038;h=142" alt="" width="319" height="142"></a></p>
<p style="text-align:justify;">Es importante definir el tipo de objeto de la variable a node-set , si no queremos tener problemas para recorrer el resultado. Una vez definido como node-set podremos usar expresiones xpath para consultar los resultados.</p>
<p style="text-align:justify;">La ejecución de la función nos devolverá un documento XML del siguiente estilo</p>
<pre>&lt;nds dtdversion="3.5" ndsversion="8.x"&gt; &lt;source&gt; &lt;product version="3.6.10.4747"&gt;DirXML&lt;/product&gt; &lt;contact&gt;Novell, Inc.&lt;/contact&gt; &lt;/source&gt; &lt;output&gt; &lt;instance class-name="User" qualified-src-dn="O=Company\OU=Users\CN=alfredo" src-dn="\ARBRE\Company\Users\Alfredo" src-entry-id="33136"&gt; &lt;attr attr-name="CN"&gt; &lt;value naming="true" timestamp="1264497510#16" type="string"&gt;alfredo&lt;/value&gt; &lt;/attr&gt; &lt;attr attr-name="sn"&gt; &lt;value naming="true" timestamp="1264497510#16" type="string"&gt;Garcia&lt;/value&gt; &lt;/attr&gt; &lt;attr attr-name="Internet Email Address"&gt; &lt;value naming="true" timestamp="1264497510#16" type="string"&gt;agarcia@company.es&lt;/value&gt; &lt;/attr&gt; &lt;/instance&gt; &lt;status level="success"&gt;&lt;/status&gt; &lt;/output&gt;&lt;/nds&gt;</pre>
<p style="text-align:justify;">Este es el contenido de la variable $user ahora , mediante xpath podemos obtener los valores que deseamos.</p>
<pre>$user/cn Para obtener el cn$user/sn Para obtener el surname</pre>
<p style="text-align:justify;">Eso es todo! para <a href="http://www.w3.org/TR/xpath/">mas información sobre consultas xpath consultar la guia de la w3c</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/techiblog.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/techiblog.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/techiblog.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/techiblog.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/techiblog.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/techiblog.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/techiblog.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/techiblog.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/techiblog.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/techiblog.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/techiblog.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/techiblog.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/techiblog.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/techiblog.wordpress.com/58/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=58&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://techiblog.wordpress.com/2010/01/26/dirxml-queries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2c726d89064e0e069ffcf85eed3c6160?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">techiblog</media:title>
		</media:content>

		<media:content url="http://techiblog.files.wordpress.com/2010/01/query.jpg" medium="image">
			<media:title type="html">query</media:title>
		</media:content>

		<media:content url="http://techiblog.files.wordpress.com/2010/01/query2.jpg?w=300" medium="image">
			<media:title type="html">query2</media:title>
		</media:content>
	</item>
		<item>
		<title>Como leer un fichero linea por linea en Bash Script</title>
		<link>http://techiblog.wordpress.com/2009/11/20/como-leer-un-fichero-linea-por-linea-en-bash-script/</link>
		<comments>http://techiblog.wordpress.com/2009/11/20/como-leer-un-fichero-linea-por-linea-en-bash-script/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 11:10:46 +0000</pubDate>
		<dc:creator>techiblog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[/bin/bash]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bash scripting]]></category>
		<category><![CDATA[gnu]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[scripts en linux]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[shell scripting]]></category>

		<guid isPermaLink="false">http://techiblog.wordpress.com/?p=52</guid>
		<description><![CDATA[Sencillo ejemplo de como leer un fichero línea por línea en bash y almacenar dicha línea en una variable para luego poder tratarla, la verdad que este código me ha resultado bastante útil durante mis tareas con sistemas operativos GNU/linux i=0 while read line do i=$(($i+1)); echo $i $line done &#60; "/etc/passwd" echo "Final line [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=52&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sencillo ejemplo de como leer un fichero línea por línea en bash y almacenar dicha línea en una variable para luego poder tratarla, la verdad que este código me ha resultado bastante útil durante mis tareas con sistemas operativos GNU/linux</p>
<pre>i=0
while read line
   do i=$(($i+1));
   echo $i $line
done &lt; "/etc/passwd"
echo "Final line count is: $i";</pre>
<p>El ejemplo lee el fichero /etc/passwd y muestra el número de línea ( variable $i ) y el contenido de la línea ( variable $line )</p>
<p>Espero que os sea igual de útil que me ha sido a mi para muchas cosas</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/techiblog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/techiblog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/techiblog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/techiblog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/techiblog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/techiblog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/techiblog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/techiblog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/techiblog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/techiblog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/techiblog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/techiblog.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/techiblog.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/techiblog.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=52&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://techiblog.wordpress.com/2009/11/20/como-leer-un-fichero-linea-por-linea-en-bash-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2c726d89064e0e069ffcf85eed3c6160?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">techiblog</media:title>
		</media:content>
	</item>
		<item>
		<title>Autenticando Joomla 1.5 usando eDirectory</title>
		<link>http://techiblog.wordpress.com/2009/07/21/autentificando-joomla-1-5-usando-edirectory/</link>
		<comments>http://techiblog.wordpress.com/2009/07/21/autentificando-joomla-1-5-usando-edirectory/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 14:21:53 +0000</pubDate>
		<dc:creator>techiblog</dc:creator>
				<category><![CDATA[eDirectory]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[autentificación]]></category>
		<category><![CDATA[autentificación ldap]]></category>
		<category><![CDATA[eDir]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[joomla 1.5]]></category>
		<category><![CDATA[joomla ldap]]></category>
		<category><![CDATA[Novell]]></category>
		<category><![CDATA[php ldap]]></category>

		<guid isPermaLink="false">http://techiblog.wordpress.com/?p=47</guid>
		<description><![CDATA[Por algunas cuestiones me interesaba que la autentificación de usuario en Joomla no se hiciera contra la base de datos MySQL local, si no que autentificara los usuarios a través de un directorio LDAP, en este caso Novell eDirectory 8.8. Permitiendo así que los usuarios del directorio pudieran entrar en Joomla con las mismas credenciales [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=47&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Por algunas cuestiones me interesaba que la autentificación de usuario en Joomla no se hiciera contra la base de datos MySQL local, si no que autentificara los usuarios a través de un directorio <strong>LDAP</strong>, en este caso <strong>Novell eDirectory 8.8</strong>. Permitiendo así que los usuarios del directorio pudieran entrar en Joomla con las mismas credenciales que usan para entrar en otros sistemas de nuestra red.</p>
<p style="text-align:justify;">Aún que este artículo se basa en la configuración para eDirectory , al ser LDAP un estándar de acceso a directorios es extrapolable a otros directorios como <a href="http://www.openldap.org/">openLDAP</a> ,<a href="http://www.microsoft.com/windowsserver2003/technologies/directory/activedirectory/default.mspx">Microsoft Active Directory</a>,<a href="http://www.sun.com/software/products/directory_srvr_ee/dir_srvr/index.xml"> Sun iPlanet</a> etc.., en este artículo sin embargo nos centraremos en <a href="http://www.novell.com/products/edirectory/">Novell eDirectory</a>.</p>
<p style="text-align:justify;">La <strong>autentificación LDAP</strong> nativa es una de las nuevas características que nos trae la versión 1.5 de Joomla, para versiones anteriores existe un paquete llamado <a href="http://sammoffatt.com.au/jauthtools/Main_Page">JAuth</a> que nos permite hacer lo mismo, pero que en este artículo no vamos a tratar.</p>
<p style="text-align:justify;">Para la configuración de la autentificación LDAP, deberemos conocer cómo funciona un directorio LDAP y como está estructurado nuestro directorio, si no es así deberíamos mirar la estructura de nuestro directorio mediante un cliente LDAP, y leer un poco de documentación sobre directorios LDAP. <span id="more-47"></span></p>
<p style="text-align:justify;">Para configurar la autentificación en Joomla, primero de todo tendremos que activar el plugin de autentificación, para ello entramos como administradores en Joomla y nos situaremos en el menú Extensiones y seleccionamos Gestión de plugins.</p>
<p style="text-align:justify;">Allí aparece una lista de todos los plugins disponibles, buscaremos y pincharemos en Authentication &#8211; LDAP, una vez allí aparecerá las opciones de configuración, primero de todo cambiaremos el Publicado a Sí.</p>
<p style="text-align:justify;">A la izquierda hay una sección titulada &#8220;Parámetros del plugin&#8221;, allí nos pedirá algunos datos.</p>
<p style="text-align:justify;"><strong>Servidor</strong>: Ponemos la dirección de nuestro servidor ip o nombre DNS</p>
<p style="text-align:justify;"><strong>Puerto</strong>: Normalmente LDAP escucha por el puerto 389 pero esto es configurable en eDirectory por lo que tendremos que asegurarnos a través de que puerto escucha nuestro servidor LDAP.</p>
<p style="text-align:justify;"><strong>Ldap V3:</strong> En mi caso Sí que queremos usar la versión 3 del protocolo LDAP</p>
<p style="text-align:justify;"><strong>Negociar TLS</strong>: En entornos de desarrollo se puede dejar en deshabilitado, en entornos productivos debería esta en habilitado. Cuidado que eDirectory por defecto exige que todas las operaciones se hagan mediante TLS, para deshabilitarlo hay que modificar en nuestro eDirectory el objeto LDAP Server y LDAP Group y quitar el check &#8220;Exigir TLS para todas las operaciones&#8221;</p>
<p style="text-align:justify;"><strong>Seguir referencias</strong>: No</p>
<p style="text-align:justify;"><strong>Método de autorización:</strong> &#8220;Asegurar y buscar&#8221; o &#8220;Se asegura directamente como usuario&#8221;, la primera busca el usuario en cualquier rama del directorio, el segundo especifica donde hay que buscar el usuario, en mi caso lo tengo con Asegurar y Buscar.</p>
<p style="text-align:justify;"><strong>Base DN:</strong> Distinguished name del objeto Base, O sea que objeto de nuestra estructura será la raíz de donde cuelgan el resto de objetos. Aquí podemos poner un objecto Organization si queremos buscar en toda la organización o una OrganizationalUnit si queremos buscar sólo en una OU, el valor de este parámetro dependerá de como hayamos estructurado nuestro directorio. Es importante que el usuario con el que nos queramos autentificar este siempre por debajo de este objeto, a uno o varios niveles si no, no seremos capaces de encontrarlo y la autentificación fallara.<br />
<strong><br />
Cadena a Buscar</strong>: Cómo buscaremos al usuario (porque atributo), en este caso lo buscaremos por el atributo cn con cn=[search] , aun que podríamos buscarlo por cualquier otro atributo con nombre_attr=[searc], si usamos &#8220;Se asegura directamente como usuario&#8221; tendremos que poner cn=[login]</p>
<p style="text-align:justify;"><strong>Nombre de usuario para la conexión:</strong> Con que usuario nos conectaremos al directorio para poder buscar a los usuarios, hay que poner el usuario administrador o un usuario con permisos, por ejemplo cn=admin,o=directory.</p>
<p style="text-align:justify;"><strong>Contraseña de conexión</strong>: Clave de este usuario</p>
<p style="text-align:justify;"><strong>Mapear: Nombre Completo</strong>: Como se llama el atributo Nombre Completo en nuestro LDAP, en nuestro caso fullName</p>
<p style="text-align:justify;"><strong>Mapear: E-mail</strong>: mail<br />
<strong><br />
Mapear: ID del usuario</strong>: cn</p>
<p style="text-align:justify;">Joomla soporta varios métodos de autentificación simultáneamente, probando primero el primer plugin, luego el segundo etc. Con el parámetro &#8220;Ordenar&#8221; definiremos el orden del plugin en este caso como la autentificación primaria será el directorio LDAP le pondremos el valor 1.</p>
<p style="text-align:justify;">Ahora ya podemos probar de autentificarnos con un usuario del directorio dentro de Joomla y en un principio tendría que funcionar.</p>
<p style="text-align:justify;">Si la autentificación no funciona.<br />
Es probable que hayamos cometido algún error en la configuración y que no nos funcione, Si no funciona debemos revisar la estructura de nuestro directorio con un visor LDAP ( por ejemplo <a href="http://www.ldapadministrator.com/download.htm">Softerra LDAP browser</a> ) , si está correctamente podemos usar el complemento de Joomla JDiagnostic el cual nos permite probar entre otras cosas los parámetros LDAP y la autentificación.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/techiblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/techiblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/techiblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/techiblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/techiblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/techiblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/techiblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/techiblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/techiblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/techiblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/techiblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/techiblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/techiblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/techiblog.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=47&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://techiblog.wordpress.com/2009/07/21/autentificando-joomla-1-5-usando-edirectory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2c726d89064e0e069ffcf85eed3c6160?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">techiblog</media:title>
		</media:content>
	</item>
		<item>
		<title>Breve introducción a la Gestión de Identidades</title>
		<link>http://techiblog.wordpress.com/2009/05/05/breve-introduccion-a-la-gestion-de-identidades/</link>
		<comments>http://techiblog.wordpress.com/2009/05/05/breve-introduccion-a-la-gestion-de-identidades/#comments</comments>
		<pubDate>Tue, 05 May 2009 11:04:27 +0000</pubDate>
		<dc:creator>techiblog</dc:creator>
				<category><![CDATA[Gestión de Identidades]]></category>
		<category><![CDATA[Gestión de Identidades Novell]]></category>
		<category><![CDATA[Identity management]]></category>
		<category><![CDATA[workflows]]></category>

		<guid isPermaLink="false">http://techiblog.wordpress.com/?p=29</guid>
		<description><![CDATA[Podríamos definir la gestión de identidades como solución que permite sincronizar datos; cuentas de usuario , grupos , objetos etc.. entre diferentes repositorios de naturaleza distinta. Un ejemplo seria poder sincronizar cuentas entre Microsoft Active Directory y una base de datos Oracle, logrando que cuando se diera de alta un usuario en Active Directory este [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=29&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Podríamos definir la gestión de identidades como solución que permite sincronizar datos; cuentas de usuario , grupos , objetos etc.. entre diferentes repositorios de naturaleza distinta.</p>
<p style="text-align:justify;">Un ejemplo seria poder sincronizar cuentas entre Microsoft Active Directory y una base de datos Oracle, logrando que cuando se diera de alta un usuario en Active Directory este mismo se replicara en la base de datos permitiéndose el acceso a ambos sistemas con la misma cuenta, obviamente no queda limitado a la conexión de dos sistemas si no que se puede conectar tantos sistemas como se requiera.</p>
<p style="text-align:justify;">Esta funcionalidad se puede lograr mediante programas a medida o mediante soluciones de gestión de identidades, en el mercado hay varios fabricantes que han lanzado diferentes soluciones, algunas de estas son :</p>
<ul>
<li><a href="http://www.oracle.com/global/es/products/middleware/identity-management/identity-management.html"><strong>Oracle</strong> Identity Management</a></li>
<li><a href="http://www.sun.com/software/products/identity_mgr/index.xml"><strong>Sun</strong> Identity Manager</a></li>
<li><a href="http://www.microsoft.com/windowsserver2008/en/us/ida-identity-lifecycle-management.aspx"><strong>Microsoft</strong> Identity Lifecycle Management</a></li>
<li><a href="http://www.novell.com/products/identitymanager/"><strong>Novell</strong> Identity Manager</a></li>
</ul>
<p style="text-align:justify;"><span id="more-29"></span>Aún que cada una de estas soluciones tiene sus particularidades, el funcionamiento básico de estas soluciones esta compuesta por un repositorio central en el que se crean y mantienen los objectos y un motor que escucha cualquier cambio que se realice en el , altas , bajas, modificaciones etc&#8230; cuando se genera un evento en este repositorio central este es replicado a los sistemas conectados mediante el envío de documentos XML ,  así como a la inversa , cuando se produce un evento en uno de los sistemas conectados este es replicado hacia el repositorio central y, desde este, hacia todos los sistemas conectados.</p>
<p style="text-align:justify;">Como resulta evidente nos puede interesar que no todos los sistemas se repliquen entre si , por ejemplo que sólo los objetos usuario se repliquen o que sólo se repliquen en uno de los sentidos, esto se configura mediante filtros, los filtros definen que objetos y que atributos de estos serán escuchados y en que sentido.</p>
<p style="text-align:justify;">También hay que tener en cuenta que cada sistema conectado tiene sus particularidades , un ejemplo serían los atributos que , aun que almacenen el mismo tipo de datos no tienen por que llamarse igual , en un sistema el atributo que guarda el número de teléfono de un usuario puede llamarse &#8220;telephone number&#8221; y en otro &#8220;telephone&#8221;, o nos puede interesar que el valor de un atributo en destino sea la concatenación de dos atributos de origen, por ejemplo, en destino tenemos un atributo que se llama &#8220;nombre completo&#8221; pero en origen no lo tenemos y queremos rellenar este atributo con el nombre concatenado con el apellido.<br />
Como tenemos estas particularidades, cada conexión entre el repositorio central y el sistema conectado tiene una serie de particularidades ,  por lo que se escriben unas reglas y políticas que modifican el documento XML que ha salido del sistema que ha generado el evento para adaptarlo a la arquitectura del sistema conectado. Al conjunto de reglas y políticas,  que modifican el documento XML con la descripción del evento le llamamos conector, normalmente los conectores viene configurados por defecto para que funcionen , pero casi siempre nos va a interesar modificarlos para adaptarlos a nuestras necesidades.</p>
<p style="text-align:justify;">La replicación de cuentas , aún que es una de las partes mas importantes de estas soluciones sólo forma una mínima parte de lo que engloban estas soluciones, entre otras cosas permiten tener interfaces web para que los propios usuarios puedan mantener sus cuentas, requerir la aprobación de uno o varios usuarios para que un objeto de replique ( workflows ), tener roles etc..</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/techiblog.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/techiblog.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/techiblog.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/techiblog.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/techiblog.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/techiblog.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/techiblog.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/techiblog.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/techiblog.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/techiblog.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/techiblog.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/techiblog.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/techiblog.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/techiblog.wordpress.com/29/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=29&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://techiblog.wordpress.com/2009/05/05/breve-introduccion-a-la-gestion-de-identidades/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2c726d89064e0e069ffcf85eed3c6160?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">techiblog</media:title>
		</media:content>
	</item>
		<item>
		<title>Error &#8220;Duplicate engine id detected&#8221; en User Application</title>
		<link>http://techiblog.wordpress.com/2009/05/05/20/</link>
		<comments>http://techiblog.wordpress.com/2009/05/05/20/#comments</comments>
		<pubDate>Tue, 05 May 2009 09:20:33 +0000</pubDate>
		<dc:creator>techiblog</dc:creator>
				<category><![CDATA[Novell User Application]]></category>
		<category><![CDATA[cluser user application]]></category>
		<category><![CDATA[cluster userapp]]></category>
		<category><![CDATA[Duplicate engine ID detected]]></category>
		<category><![CDATA[novell identity maanger]]></category>
		<category><![CDATA[user application]]></category>
		<category><![CDATA[Userapp]]></category>
		<category><![CDATA[workflows]]></category>

		<guid isPermaLink="false">http://techiblog.wordpress.com/?p=20</guid>
		<description><![CDATA[En algunas ocasiones en un entorno con User application en cluster me he encontrado con que uno de los nodos no arranca, apareciendo un error del tipo &#8220;Duplicate engine id detected. This engine may not have been shutdown cleanly or another engine is running with engine-id: ENGINE01 . Waiting 60,000 ms for heartbeat to timeout.&#8221; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=20&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En algunas ocasiones en un entorno con User application en cluster me he encontrado con que uno de los nodos no arranca, apareciendo un error del tipo</p>
<p><strong><em><br />
&#8220;Duplicate engine id detected. This engine may not have been shutdown cleanly or another engine is running with engine-id: ENGINE01 . Waiting 60,000 ms for heartbeat to timeout.&#8221;</em></strong></p>
<p>Esto es debido a que uno de los nodos del cluster no se ha cerrado bien y se queda a la espera , en principio esperando un tiempo prudencial tendría que arrancar , pero no siempre es así. Para forzar a arrancar el nodo tenemos que cambiar en la tabla de estado de los nodos el estado de dicho, eso se hace accediendo a la base de datos , en mi caso la por defecto , MySQL y consultando la tabla AFENGINESTATE.</p>
<div style="font-size:9px;">select * from AFENGINESTATE;</p>
<table style="height:92px;" border="0" cellspacing="0" cellpadding="0" width="503">
<tbody>
<tr>
<td>ENGINEID</td>
<td>HEARTBEAT</td>
<td>STARTTIME</td>
<td>SHUTDOWNTIME</td>
<td>ENGINESTATE</td>
</tr>
<tr>
<td>Engine01</td>
<td>2009-05-04 21:58:13</td>
<td>2009-05-04 21:51:13</td>
<td>NULL</td>
<td>1</td>
</tr>
<tr>
<td>Engine02</td>
<td>2009-05-04 21:58:39</td>
<td>2009-05-04 21:54:39</td>
<td>NULL</td>
<td>1</td>
</tr>
</tbody>
</table>
</div>
<p>En esta tabla podemos ver los dos nodos del cluster , llamados Engine01 y Engine02 , en este caso el Engine02 aparece arrancado cuando en verdad no lo esta, borramos el registro y volvemos a arrancar el nodo y veremos como ya no aparece y el nodo arranca correctamente.</p>
<p>El comando para borrar el registro podria ser por ejemplo este :</p>
<div style="font-family:courier;">delete from AFENGINESTATE where ENGINEID=&#8217;Engine02&#8242;;</div>
<p>Ahora al volver a arrancar el servicio podremos ver como jboss y User Application vuelven a arrancar.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/techiblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/techiblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/techiblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/techiblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/techiblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/techiblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/techiblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/techiblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/techiblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/techiblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/techiblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/techiblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/techiblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/techiblog.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=20&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://techiblog.wordpress.com/2009/05/05/20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2c726d89064e0e069ffcf85eed3c6160?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">techiblog</media:title>
		</media:content>
	</item>
		<item>
		<title>Ejecutar sentencias SQL directamente desde nuestro conector JDBC.</title>
		<link>http://techiblog.wordpress.com/2009/03/12/ejecutar-sentencias-sql-directamente-desde-nuestro-conector-jdbc/</link>
		<comments>http://techiblog.wordpress.com/2009/03/12/ejecutar-sentencias-sql-directamente-desde-nuestro-conector-jdbc/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 14:28:25 +0000</pubDate>
		<dc:creator>techiblog</dc:creator>
				<category><![CDATA[DirXML]]></category>
		<category><![CDATA[Gestión de Identidades Novell]]></category>

		<guid isPermaLink="false">http://techiblog.wordpress.com/?p=13</guid>
		<description><![CDATA[Aún que el conector JDBC se encarga de realizar todas las operaciones sobre la base de datos, en algunos casos particulares nos puede interesar el hecho de ejecutar sentencias SQL desde las reglas directamente a la base de datos. Hay que tener en cuenta que estamos atacando directamente la base de datos y no pasamos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=13&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Aún que el conector JDBC se encarga  de realizar todas las operaciones sobre la base de datos, en algunos casos  particulares nos puede interesar el hecho de ejecutar sentencias SQL desde las  reglas directamente a la base de datos. Hay que tener en cuenta que estamos  atacando directamente la base de datos y no pasamos por la política de Schemma  Mapping, por lo que deberemos hacer referencia a los objetos y atributos tal y  como están en la base de datos, de hecho el conector cuando ve la sentencia ,  no sigue ejecutando políticas y procede a ejecutar la sentencia SQL.</p>
<p>Existen dos tipos de  sentencias SQL; Sentencias de ejecución, de las que sólo nos tenemos que  preocupar de ejecutar,como es el caso de un update.O las sentencias de  consulta, que nos devuelven un resultado, en este caso deberemos capturar el  resultado y recorrer los valores segun nos convenga, como seria el caso de una  sentencia select.</p>
<p><span id="more-13"></span></p>
<p><strong>Sentencias de ejecución</strong></p>
<p>Empecemos pues por el primer  caso,por seguir un ejemplo,imagina que deseamos hacer una regla dentro de  nuestro conector,que refleje en una tabla de eventos de la base de datos, cada  modificación de un campo en Meta.</p>
<p>Con el fin de mantener este  histórico, insertaremos un registro con el valor antiguo , el nuevo y el  identificador de usuario cada vez que se propague un cambio de atributo desde  el metadirectorio.</p>
<p>El codigo XML que  necesitamos generar para ejecutar la sentencia es el siguiente :</p>
<p>&lt;jdbc:statement event-id=&#8221;1&#8243; jdbc:type=&#8221;insert&#8221; xmlns:jdbc=&#8221;urn:dirxml:jdbc&#8221;&gt;</p>
<p>&lt;jdbc:sql&gt;insert into  eventlog(newvalue,oldvalue,id) values(&#8216;Jose&#8217;,'Manuel&#8217;,4)&lt;/jdbc:sql&gt;</p>
<p>&lt;/jdbc:statement&gt;</p>
<p>Encontramos un nodo  jdbc:statement con el atributo event-id, que nos servirá como identificador de  la sentencia ,el atributo jdbc:type con el tipo de sentencia que ejecutamos y  el atributo xmlns:jdbc. Luego y como hijo del nodo jdbc:statement encontramos  un nodo jdbc:sql con el codigo SQL de la sentencia que queremos ejecutar.</p>
<p>Para ello , dentro de nuestra regla DirXML construiremos el codigo anterior,  usando la función <strong><em>append XML element()</em></strong> para añadir los nodos,  luego a cada uno de los nodos le añadiremos los atributos usando la función <strong><em>set  XML attribute()</em></strong> y finalmente le añadimos valor usando la función <strong><em>append xml text() </em></strong></p>
<p>Observemos la siguiente  regla, esta regla añade el código anterior en el documento XML que capturara el  evento.</p>
<p>&lt;rule&gt;</p>
<p>&lt;description&gt;Reflejar cambio  en tabla de eventos&lt;/description&gt;</p>
<p>&lt;comment xml:space=&#8221;preserve&#8221;&gt;Inserta un  registro en la tabla de eventos de la base de datos.&lt;/comment&gt;</p>
<p>&lt;conditions&gt;</p>
<p>&lt;and&gt;</p>
<p>&lt;if-class-name mode=&#8221;nocase&#8221;  op=&#8221;equal&#8221;&gt;User&lt;/if-class-name&gt;</p>
<p>&lt;if-association op=&#8221;associated&#8221;/&gt;</p>
<p>&lt;if-operation op=&#8221;equal&#8221;&gt;modify&lt;/if-operation&gt;</p>
<p>&lt;/and&gt;</p>
<p>&lt;/conditions&gt;</p>
<p>&lt;action/&gt;</p>
<p>&lt;actions&gt;</p>
<p><strong>&lt;!&#8211; Declaramos una variable  con la sentencia SQL que queremos ejecutar &#8211;&gt; </strong></p>
<p>&lt;do-set-local-variable name=&#8221;sql&#8221;  scope=&#8221;policy&#8221;&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-text xml:space=&#8221;preserve&#8221;&gt;insert into  eventlog(newvalue,oldvalue,id) values(&#8216;,&lt;/token-text&gt;</p>
<p>&lt;token-op-attr name=&#8221;Given  Name&#8221;/&gt;</p>
<p>&lt;token-text xml:space=&#8221;preserve&#8221;&gt;&#8217;,'&lt;/token-text&gt;</p>
<p>&lt;token-attr name=&#8221;Given  Name&#8221;/&gt;</p>
<p>&lt;token-text xml:space=&#8221;preserve&#8221;&gt;&#8217;,'&lt;/token-text&gt;</p>
<p>&lt;token-association/&gt;</p>
<p>&lt;token-text xml:space=&#8221;preserve&#8221;&gt;&#8217;)&lt;/token-text&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-set-local-variable&gt;</p>
<p><strong>&lt;!&#8211; Añadimos en nodo  jdbc:statement &#8211;&gt;</strong></p>
<p>&lt;do-append-xml-element expression=&#8221;/nds/input&#8221;  name=&#8221;jdbc:statement&#8221;/&gt;</p>
<p><strong>&lt;!&#8211; Añadimos  atributo jdbc:type &#8211;&gt;</strong></p>
<p>&lt;do-set-xml-attr expression=&#8221;/nds/input/jdbc:statement&#8221;  name=&#8221;jdbc:type&#8221;&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-text xml:space=&#8221;preserve&#8221;&gt;update&lt;/token-text&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-set-xml-attr&gt;</p>
<p><strong> &lt;!&#8211; Añadimos atributo event-id  &#8211;&gt;</strong></p>
<p>&lt;do-set-xml-attr  expression=&#8221;/nds/input/jdbc:statement[last()]&#8221;  name=&#8221;event-id&#8221;&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-text xml:space=&#8221;preserve&#8221;&gt;0&lt;/token-text&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-set-xml-attr&gt;</p>
<p><strong>&lt;!&#8211; Añadimos dentro de  jdbc:statement un nodo jdbc:sql &#8211;&gt;</strong></p>
<p>&lt;do-append-xml-element expression=&#8221;/nds/input/jdbc:statement[last()]&#8221;  name=&#8221;jdbc:sql&#8221;/&gt;</p>
<p><strong>&lt;!&#8211; Le añadimos el contenido  en este caso el de la variable sql definida arriba &#8211;&gt;</strong></p>
<p>&lt;do-append-xml-text expression=&#8221;/nds/input/jdbc:statement[last()]/jdbc:sql[last()]&#8220;&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-local-variable  name=&#8221;sql&#8221;/&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-append-xml-text&gt;</p>
<p>&lt;/actions&gt;</p>
<p>&lt;/rule&gt;</p>
<p>La salida de dicha regla  crea el texto resaltado en la traza.</p>
<p>&lt;nds dtdversion=&#8221;3.5&#8243; ndsversion=&#8221;8.x&#8221;&gt;</p>
<p>&lt;source&gt;</p>
<p>&lt;product version=&#8221;3.5.10.20070918  &#8220;&gt;DirXML&lt;/product&gt;</p>
<p>&lt;contact&gt;Novell, Inc.&lt;/contact&gt;</p>
<p>&lt;/source&gt;</p>
<p>&lt;input&gt;</p>
<p><strong>&lt;</strong><strong>jdbc:statement </strong><strong>event-id</strong><strong>=</strong><strong>&#8220;1&#8243; </strong><strong>jdbc:type</strong><strong>=</strong><strong>&#8220;insert&#8221; </strong><strong>xmlns:jdbc</strong><strong>=</strong><strong>&#8220;urn:dirxml:jdbc&#8221;</strong><strong>&gt;</strong><strong> </strong></p>
<p><strong> </strong><strong>&lt;</strong><strong>jdbc:sql</strong><strong>&gt;</strong><strong>insert into  eventlog(newvalue,oldvalue,id) values(&#8216;Jose&#8217;,'Manuel&#8217;,4)</strong><strong>&lt;/</strong><strong>jdbc:sql</strong><strong>&gt;</strong><strong> </strong></p>
<p><strong> </strong><strong>&lt;/</strong><strong>jdbc:statement</strong><strong>&gt;</strong><strong> </strong></p>
<p>&lt;modify class-name=&#8221;User&#8221;  event-id=&#8221;idm-lab#20090309213232#1#1&#8243;  qualified-src-dn=&#8221;O=Organization\OU=Users\CN=User001&#8243;  src-dn=&#8221;\IDM-LAB\Organization\Users\User001&#8243;  src-entry-id=&#8221;45586&#8243;  timestamp=&#8221;1236634352#2&#8243;&gt;</p>
<p>&lt;association state=&#8221;associated&#8221;&gt;ID_USUARIO=4,TABLE=usuarios&lt;/association&gt;</p>
<p>&lt;modify-attr attr-name=&#8221;Given  Name&#8221;&gt;</p>
<p>&lt;remove-value&gt;</p>
<p>&lt;value timestamp=&#8221;1236634008#1&#8243;  type=&#8221;string&#8221;&gt;Manuel&lt;/value&gt;</p>
<p>&lt;/remove-value&gt;</p>
<p>&lt;add-value&gt;</p>
<p>&lt;value timestamp=&#8221;1236634352#2&#8243;  type=&#8221;string&#8221;&gt;Jose&lt;/value&gt;</p>
<p>&lt;/add-value&gt;</p>
<p>&lt;/modify-attr&gt;</p>
<p>&lt;/modify&gt;</p>
<p>&lt;/input&gt;</p>
<p>&lt;/nds&gt;<strong> </strong></p>
<p>Como podemos ver , la regla ha añadido el código XML con la  sentencia SQL,  vamos a explicar las  línea más relevantes del código :</p>
<p>&lt;do-append-xml-element expression=&#8221;/nds/input&#8221;  name=&#8221;jdbc:statement&#8221;/&gt;</p>
<p>Añadimos  debajo del nodo input que está debajo de nds un nuevo nodo llamado  jdbc:statement ( Mirar el documento anterior )</p>
<p>&lt;do-set-xml-attr expression=&#8221;/nds/input/jdbc:statement[last()]&#8221;  name=&#8221;jdbc:type&#8221;&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-text xml:space=&#8221;preserve&#8221;&gt;update&lt;/token-text&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-set-xml-attr&gt;</p>
<p>A este nuevo nodo que hemos añadido ( /nds/input/jdbc:statement[last()] ) le añadimos un  atributo nuevo llamado jdbc:type con el valor update. Notar que estamos usando  XPath para seleccionar los nodos, en este caso el último nodo jdbc:statement  debajo de /nds/input , ya que podrían haber varios nodos jdbc:statement y el  que hemos añadido ahora sabemos que es el ultimo.</p>
<p>&lt;do-set-xml-attr expression=&#8221;/nds/input/jdbc:statement[last()]&#8221;  name=&#8221;event-id&#8221;&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-text xml:space=&#8221;preserve&#8221;&gt;0&lt;/token-text&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-set-xml-attr&gt;</p>
<p>Añadimos otro  atributo al nodo ( /nds/input/jdbc:statement[last()] ) con nombre event-id y valor 0.  Este atributo nos ayudara a identificar entre diferentes sentencias sql al  usarlo como identificador de sentencia.</p>
<p>&lt;do-append-xml-element expression=&#8221;/nds/input/jdbc:statement[last()]&#8221;  name=&#8221;jdbc:sql&#8221;/&gt;</p>
<p>Añadimos debajo  el ultimo nodo jdbc:statement hijo de /nds/input un nuevo nodo llamado jdbc:sql</p>
<p>&lt;do-append-xml-text  expression=&#8221;/nds/input/jdbc:statement[last()]/jdbc:sql[last()]&#8220;&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-local-variable  name=&#8221;sql&#8221;/&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-append-xml-text&gt;</p>
<p>Ahora  seleccionamos dicho nodo (el último nodo jdbc:sql del último nodo  jdbc:statement ) y le añadimos contenido , en este caso el contenido de la  variable sql definida anteriormente.</p>
<p><strong>Sentencias de  consulta</strong></p>
<p><strong></strong></p>
<p>A la hora de  lanzar sentencias SQL de tipo select, hay que tener en cuenta que hay que  capturar el resultado de estas , el resultado vendrá por el canal publisher y  lo podremos capturar en las reglas de input ,justo antes de las políticas de  Schema Mapping.</p>
<p>Un ejemplo podría ser , lanzamos la siguiente  consulta</p>
<p>&lt;jdbc:statement event-id=&#8221;2&#8243; jdbc:type=&#8221;insert&#8221;  xmlns:jdbc=&#8221;urn:dirxml:jdbc&#8221;&gt;</p>
<p>&lt;jdbc:sql&gt;<strong>select  id_usuario as &#8216;Id Usuario&#8217; from usuarios where ( nombre=&#8217;Miguel&#8217; and  apellido=&#8217;Gomez&#8217; )</strong>&lt;/jdbc:sql&gt;</p>
<p>&lt;/jdbc:statement&gt;</p>
<p>Esta sentencia  nos devolverá ( en las reglas de Input del canal Publisher ) el siguiente  documento XML.</p>
<p>&lt;nds dtdversion=&#8221;2.0&#8243;  ndsversion=&#8221;8.x&#8221;  xmlns:jdbc=&#8221;urn:dirxml:jdbc&#8221;&gt;</p>
<p>&lt;source&gt;</p>
<p>&lt;product build=&#8221;20070918_0743&#8243;  instance=&#8221;Oracle-test&#8221;  version=&#8221;3.5.2&#8243;&gt;DirXML Driver  for JDBC&lt;/product&gt;</p>
<p>&lt;contact&gt;Novell, Inc.&lt;/contact&gt;</p>
<p>&lt;/source&gt;</p>
<p>&lt;output&gt;</p>
<p>&lt;jdbc:result-set event-id=&#8221;2&#8243; jdbc:number-of-rows=&#8221;1&#8243;&gt;</p>
<p>&lt;jdbc:row jdbc:number=&#8221;1&#8243;&gt;</p>
<p>&lt;jdbc:column jdbc:name=&#8221;Id  Usuario&#8221; jdbc:position=&#8221;1&#8243; jdbc:type=&#8221;java.sql.Types.NUMERIC&#8221;&gt;</p>
<p>&lt;jdbc:value&gt;16254&lt;/jdbc:value&gt;</p>
<p>&lt;/jdbc:column&gt;</p>
<p>&lt;/jdbc:row&gt;</p>
<p>&lt;/jdbc:result-set&gt;</p>
<p>&lt;status event-id=&#8221;0&#8243; level=&#8221;success&#8221;/&gt;</p>
<p>&lt;/output&gt;</p>
<p>&lt;/nds&gt;</p>
<p>Para poderlo  capturar necesitaremos una regla para capturar el valor.</p>
<p>&lt;rule&gt;</p>
<p>&lt;description&gt;Capturar  identificador de usuario&lt;/description&gt;</p>
<p>&lt;comment xml:space=&#8221;preserve&#8221;&gt;Lee de la query  anterior el valor para el identificador de usuario&lt;/comment&gt;</p>
<p>&lt;conditions&gt;</p>
<p>&lt;and&gt;</p>
<p>&lt;if-xpath op=&#8221;true&#8221;&gt;/nds/output/jdbc:result-set[@event-id=2]&lt;/if-xpath&gt;</p>
<p>&lt;/and&gt;</p>
<p>&lt;/conditions&gt;</p>
<p>&lt;actions&gt;</p>
<p>&lt;do-set-local-variable name=&#8221;id_usuario&#8221;  scope=&#8221;driver&#8221;&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-xpath expression=&#8221;//jdbc:value&#8221;/&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-set-local-variable&gt;</p>
<p>&lt;do-trace-message&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-text xml:space=&#8221;preserve&#8221;&gt;Proximo Valor &lt;/token-text&gt;</p>
<p>&lt;token-local-variable  name=&#8221;id_usuario&#8221;/&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-trace-message&gt;</p>
<p>&lt;/actions&gt;</p>
<p>&lt;/rule&gt;</p>
<p>Vamos a comentar  un poco las líneas de esta regla.</p>
<p>&lt;if-xpath op=&#8221;true&#8221;&gt;/nds/output/jdbc:result-set[@event-id=2]&lt;/if-xpath&gt;</p>
<p>Entra en la  regla si encuentra un atributo event-id con valor dos dentro de un nodo  jdbc:result-set. Como habíamos comentado anteriormente el atributo  jdbc:result-set nos sirve para identificar las sentencias sql.</p>
<p>&lt;do-set-local-variable name=&#8221;id_usuario&#8221;  scope=&#8221;driver&#8221;&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-xpath expression=&#8221;//jdbc:value&#8221;/&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-set-local-variable&gt;</p>
<p>Cogemos el valor  de todos los  nodos jdbc:value ( sólo  tenemos uno ) y lo guardamos en la variable id_usuario.</p>
<p>En nodos  jdbc:result-set con más de un valor y atributo la cosa se vuelve mas divertida,  es cuestión de ir seleccionando los nodos que queremos mediante el uso de  expresiones XPath.</p>
<p>Aquí un ejemplo  de cómo podríamos recorrer todos los atributos Identificador</p>
<p>&lt;do-for-each&gt;</p>
<p>&lt;arg-node-set&gt;</p>
<p>&lt;token-xpath expression=&#8217;/nds/output/jdbc:result-set/jdbc:row/jdbc:column[@jdbc:name="Identificador"]&#8216;/&gt;</p>
<p>&lt;/arg-node-set&gt;</p>
<p>&lt;arg-actions&gt;</p>
<p>&lt;do-set-local-variable name=&#8221;lista&#8221;  scope=&#8221;policy&#8221;&gt;</p>
<p>&lt;arg-string&gt;</p>
<p>&lt;token-local-variable  name=&#8221;lista&#8221;/&gt;</p>
<p>&lt;token-xpath expression=&#8221;$current-node/jdbc:value&#8221;/&gt;</p>
<p>&lt;/arg-string&gt;</p>
<p>&lt;/do-set-local-variable&gt;</p>
<p>&lt;/arg-actions&gt;</p>
<p>&lt;/do-for-each&gt;</p>
<p>Tenemos un bucle for each donde vamos recorriendo  todos los valores que nos devuelve la expresión XPath y concatenarlos en una  variable llamada lista</p>
<p>Para finalizar el post , recomendaria leer la  documentación de XPath de la W3C donde explica las funciones disponibles así  como las formas de seleccioanar nodos.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/techiblog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/techiblog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/techiblog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/techiblog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/techiblog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/techiblog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/techiblog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/techiblog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/techiblog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/techiblog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/techiblog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/techiblog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/techiblog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/techiblog.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techiblog.wordpress.com&amp;blog=6843483&amp;post=13&amp;subd=techiblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://techiblog.wordpress.com/2009/03/12/ejecutar-sentencias-sql-directamente-desde-nuestro-conector-jdbc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2c726d89064e0e069ffcf85eed3c6160?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">techiblog</media:title>
		</media:content>
	</item>
	</channel>
</rss>
