jump to navigation

Tecnicas de Programacion – Inversion de Control mayo 21, 2007

Posted by superpiwi in Eclipse, Java, Programacion.
19 comments

Articulo interesante que me encuentro en Amol’s Learning Journal

Inversion of control, tambien conocido como dependency Injection, se refiere a la forma en que un objeto usa otro objeto.
Por ejemplo, Supon que tenemos la siguiente clase A, que usa a la clase B,
tradicionalmente creas y usas una instancia de la clase B dentro de la
clase A, de acuerdo al siguiente ejemplo:

Class A
{
private B b;
public A() {
b = new B();
}
public void doSomething(){
b.someMethod();
}
}

Esto presenta el siguientes problema:

Un cambio en la implementacion del constructor de la clase B,
implicara cambiar la implementacion de la clase A. Imagina por ejemplo
que ahora como parametro al constructor de la clase B, le pasas un
String:

public B(String str);

necesariamente has de adaptar la clase A, donde se utiliza ese constructor.

Y tambien imagina que lo unico que quieres hacer es cambiar la implementacion del servicio. Por ejemplo tienes una clase C, que implementa el mismo metodo de la clase B (doSomething) pero de otra manera, el cambiar de esa implementacion de servicio a la otra, deberia poder ser inmediata sin necesidad de tener que tocar el codigo de la clase A.

La solucion a estos problemas: La inversion de Control.
Veamoslo con un ejemplo:

Definimos la clase A:

public class A
{
private C c;
public A(C objetoc)
{
this.c = objetoc;
}
public void hago_algo()
{
c.hacer_algo();
}
}

Como observas, pasamos el objeto en el constructor, no lo instanciamos dentro del constructor como haciamos antes con el operador «new».

Para la clase C, definimos la interface:

public interface C {
public void hacer_algo();
}

y dos clases que implementan el metodo de manera diferente:

public class C_Implementacion1 implements C
{
public void hacer_algo()
{
// hacer algo version 1
System.out.println("Implementacion 1 de algo");
}
}

public class C_Implementacion2 implements C
{
public void hacer_algo()
{
// hacer algo version 2
System.out.println("Implementacion 2 de algo, algo diferente a lo que haga en 1");
}
}

Como ves, ahora es posible cambiar el constructor de las clases C, o el metodo que usamos en la clase A, sin necesidad de modificar el codigo
existente de A.

public static void main(String[] args) {
C metodo1 = new C_Implementacion1();
A a = new A(metodo1);
C metodo2 = new C_Implementacion2();
a = new A(metodo2);
}

Las ventajas son evidentes.

Eclipse «negro» mayo 17, 2007

Posted by superpiwi in Eclipse, Java, Programacion.
3 comments

He cambiado de tema de escritorio y por tanto he adaptado el esquema de colores de mi Eclipse para poder visualizar bien todos los elementos. Queda asi:

eclipse01.jpg

Y el tuyo. ¿Como es tu eclipse?

Comparte tu codigo mayo 14, 2007

Posted by superpiwi in Eclipse, Java, Programacion.
add a comment

Naslu

Naslu es una nueva web puesta en marcha por un grupo españoles que utiliza la misma estructura de la web de Youtube pero para en lugar de compartir videos compartir trozos de código de programación.

Como podeis ver los usuarios van añadiendo trozos de código que pueden faciliar en cierta medida el trabajo de los programadores y esos trozos de código se pueden luego insertar en un blog para darlos a conocer a otros programadores.

Para saber más sobre Naslu os recomiendo ver su blog.

Nota: Recortex es un sitio con la misma finalidad pero con otro formato.

Visto en | loogic

Ejecutar multiples sentencias SQL con iBatis mayo 14, 2007

Posted by superpiwi in Eclipse, Java, Oracle, Programacion.
add a comment

Proximamente (todo depende del tiempo que me quede disponible) escribire una serie de tutoriales introductorios de iBatis. De todas formas aqui os comento algo que no esta del todo muy documentado y que puede servir a aquellas personas que ya emplean este framework.

El caso es para Oracle 10. Si necesitas ejecutar varias sentencias SQL debes escribir en el XML algo parecido a lo siguiente (es solo un ejemplo, adaptalo a tu caso particular):

<statement id="borrarDatos" parameterClass="comun.beans.Project" >
<![CDATA[
BEGIN
DELETE FROM TABLA1 WHERE PROJECT=#id#;
DELETE FROM TABLA2 WHERE PROJECT=#id#;
DELETE FROM TABLA3 WHERE PROJECT=#id#;
DELETE FROM TABLA4 PROJECT=#id# AND SID<>'0';
END;
]]>
</statement>

Despues lo ejecutariamos mediante un «update» por ejemplo:


Project p = new Project();
p.setId("666");
SQLMap.update("borrarDatos",p);

En resumen, empleamos el tagname <statement></statement> y encerramos las sentencias SQL separadas por ; y entre los elementos BEGIN y END;

Mas informacion | OpenSource

Ajax ya mayo 9, 2007

Posted by superpiwi in Ajax, Cursos, Java, Javascript, Programacion.
add a comment

El objetivo de este tutorial es poder aprender Ajax viendo un concepto teórico, luego algunos ejercicios resueltos y otros por resolver.
Puede desarrollar los ejercicios en el sitio, probarlos, modificarlos y ver los resultados inmediatamente.

Ajax Ya

ApacheDS, servidor LDAP de Apache mayo 4, 2007

Posted by superpiwi in Eclipse, Java, Programacion.
add a comment

Un Servidor de LDAP escrito totalmente en JAVA y muy extensible.

ldapstudio_browser.png

En su sitio web (http://directory.apache.org) encuentras la guia y el tutorial.

Visto en Ibell

Adobe Flex es libre abril 30, 2007

Posted by superpiwi in Java, Programacion.
add a comment

Una muy buena noticia que ya me ha llegado por varios sitios.

La verdad que nunca la llegue a usar porque era de pago y las pocas cosas que hice con Flash utilice OpenLaszlo

Copio y pego parte del articulo de HacheMuda:

Flex es una tecnología que permite elaborar grandes aplicaciones web más fácil y rápidamente. Siempre que se tenga un navegador con soporte para Flash, las posibilidades son infinitas.

Puedes probar diferentes módulos por categorías desde una web que han creado para probar Flex online tú mismo y ver el código fuente y el resultado.

Shell Script – Consulta de Oracle almacenando el resultado en un Array abril 25, 2007

Posted by superpiwi in Java, Oracle, Programacion, Unix.
7 comments

Aqui un pequeño script que uso cuando realizo una consulta a Oracle y quiero guardar los resultados de la consulta en un Array de variables de un Shell Script para su posterior tratamiento.

consulta.sh


#!/bin/bash
#------------------------------------------------------------------------------
# EJEMPLO EN SHELL SCRIPT DE CONSULTA A ORACLE DEVOLVIENDO RESULTADO EN UN
# ARRAY DE VARIABLES
#
# @author
# @revision 10 Ago 2006
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# read_sql_stmt
#
# la funcion empleada para conectar a oracle y ejecutar la consulta
# @param stmt la sentencia SQL a ejecutar
# @param login la cadena de conexion a la base de datos en formato usuario/password@SID
#------------------------------------------------------------------------------
read_sql_stmt() {
typeset stmt=$1
typeset login=$2
echo "
set feedback off verify off heading off pagesize 0
$stmt;
exit
" | sqlplus -s $login
}
#------------------------------------------------------------------------------
echo "[ ->COMIENZO<- ]"
ORACLE_HOME=/usr/lib/oracle/10.2.0.3/client
PATH=$ORACLE_HOME/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
#No es necesario especificar TNS_ADMIN ya apunta por defecto
#TNS_ADMIN=$ORACLE_HOME/network/admin
export ORACLE_HOME
export PATH
export LD_LIBRARY_PATH
#
# En este ejemplo hacemos un select recorremos los resultados y los devolvemos
# en un array de variables compuesta por cadenas separadas por el token ","
# La consulta es sobre una tabla de ORACLE de mi modelo datos, cambia la sentencia
# SQL por la que utilices
#
CADENA_CONEXION="desa/desa@DESARROLLO"
export CADENA_CONEXION
echo "CADENA CONEXION $CADENA_CONEXION"
# Ejecutamos la consulta y devolvemos la fila de resultados en un ARRAY
# NOTA: aqui hay 2 columnas y hacemos un read $var1 $var2, si hubiera mas columnas deberias añadir mas variables de control $varN
ARRAY_1=(`read_sql_stmt "select login,password from STCORE_USER" $CADENA_CONEXION | while read var1 var2
do
#echo "$i||$n"
#exho "$i:$n"
#echo "$i\"$n"
#para el ejemplo tokenizamos las columnas separandolas con | y repitiendo la primera en la tercera
#echo "$i|$n|$i"
echo "login:{$var1},password:{$var2},$var1"
done`)
# Recorrer Todos, Recorremos el Array y generamos una traza de ejemplo que nos interese
echo "[ Procesar todos ]:"
for i in ${ARRAY_1[@]}; do
echo "__RESPUESTA__|Query1_Login|$i" >> consulta.log
done
cat ./consulta.log
rm ./consulta.log
# Otra forma de recorrer todos
# puede emplearse * en lugar de @
echo ""
echo "[ Otra forma de Todos ]:"
echo ${ARRAY_1[*]}
# Contar el numero de elementos
# (Loop until we find an empty string.)
count=0
while [ "x${ARRAY_1[count]}" != "x" ]
do
count=$(( $count + 1 ))
done
echo ""
echo "[ Numero de elementos del Array ]:"
echo "Hay $count Elementos en el array"
echo ""
echo "[ Consulta de elementos del array por el indice ]:"
echo "El Primero es: ${ARRAY_1[0]}"
echo "0 OK"
echo "[ FIN ]"

El shell script esta comentado con lo que facilmente puedes adaptarlo a tus propias consultas.

Realmente estoy realizando una consulta por los campos «login» y «password» de una tabla denominada «STCORE_USER» y al final genero un fichero con este formato:

__RESPUESTA__|Query1.login|login:{aqui la primera columna},password:{aqui la segunda},primera_columna

Al ejecutarlo en mi caso tengo un output como este:

jose@soledad:~/Desktop$ ./consulta.sh
[ ->COMIENZO<- ]
CADENA CONEXION desa/desa@DESARROLLO
[ Procesar todos ]:
__RESPUESTA__|Query1_Login|login:{admin},password:{admin},admin
__RESPUESTA__|Query1_Login|login:{test},password:{test},test
[ Otra forma de Todos ]:
login:{admin},password:{admin},admin login:{test},password:{test},test
[ Numero de elementos del Array ]:
Hay 2 Elementos en el array
[ Consulta de elementos del array por el indice ]:
El Primero es: login:{admin},password:{admin},admin
0 OK
[ FIN ]
jose@soledad:~/Desktop$

Escribir los mensajes de trazas con Log4J abril 24, 2007

Posted by superpiwi in Eclipse, Java, Programacion.
5 comments

En biese me encuentro un articulo muy interesante de como escribir los mensajes de trazas de nuestra aplicacion en el fichero de log de Jboss.Yo ahora mismo no tengo Jboss instalado, asi que adapto un poco el fichero xml para que me funcione de manera independiente.

Tambien me añado al claspath las siguientes librerias:


commons-logging.jar
commons-logging-1.0.4.jar
log4j-1.2.12.jar

El fichero log4j generalemente es un fichero plano de texto (log4j.properties), aqui empleamos un fichero en formato XML.  

Los ficheros quedan como siguen:

log4j.xml:


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
<!-- A size based file rolling appender -->
<appender name="FILE"
class="org.apache.log4j.RollingFileAppender">
<errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler" />
<param name="File" value="${jboss.server.home.dir}/tmp/log/server.log"/>
<param name="Append" value="false" />
<param name="MaxFileSize" value="20000KB" />
<param name="MaxBackupIndex" value="400" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d | %-5r | %-5p | %c | %t:%x | %m%n"/>
</layout>
</appender>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<!--
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
-->
<param name="Target" value="System.out"/>
<param name="Threshold" value="DEBUG"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
<!-- your own log message -->
<appender name="APPLOG"
class="org.apache.log4j.RollingFileAppender">
<errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler" />
<param name="File" value="${jboss.server.home.dir}/tmp/log/myapp/application.log"/>
<param name="Append" value="false" />
<param name="MaxFileSize" value="20000KB" />
<param name="MaxBackupIndex" value="400" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d | %-5r | %t | %m%n"/>
</layout>
</appender>
<!-- your looger -->
<logger name="com.me.ApplicationLogger" additivity="false">
<!--
<priority value="INFO" />
-->
<appender-ref ref="APPLOG" />
<appender-ref ref="CONSOLE" />
</logger>
<!-- Setup the root logger -->
<root>
<priority value="DEBUG" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</log4j:configuration>

ApplicationLogger.java:


package com.me;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ApplicationLogger {
public static Log getLogger(){
return LogFactory.getLog(ApplicationLogger.class);
}
}

WithdrawInterface.java:


package com.me;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class WithdrawInterface {
public void withdraw(String user, double amount) {
Log appLogger = ApplicationLogger.getLogger();
appLogger.info("withdraw: " + user + " ;" + amount);
}
//----
public static void main(String[] args) {
try
{
WithdrawInterface wd=new WithdrawInterface();
wd.withdraw("root", 1000.02);
} catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
}
//----
}

Y el resultado de ejecutarlo desde Eclipse:

eclipse01.jpg

Generar la documentacion del Modelo de Datos abril 24, 2007

Posted by superpiwi in Eclipse, Java, Oracle, Programacion, UML.
add a comment

Generar la documentacion del Modelo de Datos