lunes, noviembre 27, 2006

Compartir URLs


Aprovechando que es Lunes (quiero quejarme de algo) y que ya lo he leído por ahí, quiero apoyar una idea:
Sería hora que alguien pusiera orden al infierno de compartir URLs. Lo que aparece normalmente en los artículos () no es sostenible. Que cada web para compartir vínculos tengo su propia forma de hacerlo es muy del siglo pasado. No digo de llegar al extremo de hacer una JSR para ello, pero algún orden no vendría mal.

miércoles, noviembre 22, 2006

Java web frameworks - Cuál elegir?


Si hay algo imposible en estos días (y desde hace tiempo) es elegir un framework web en Java. Es mas cuestión de gusto que de tecnología. Y eso molesta. Hace que la competencia (léase .NET) sean mucho mas fáciles de adoptar. Cuáles de ellos hay que seguir día a día para ver como avanzan? En mi opinión:

  • Shale Basado en JavaServer Faces.
  • Wicket Modelado web... en java.
  • Stripes MVC clásico, pero con casi cero configuración.
  • Seam Basado en EJB 3.0 y un poco pegado a productos JBOSS.


Update: Con el nuevo Seam 1.1 se pueden utilizar POJOs fuera de un servidor EJB 5.0. Incluso con Tomcat.

lunes, noviembre 20, 2006

Tecnologías con las que me gustaría trabajar (I)


Una de las tecnologías con las que me gustaría hacer algo productivo (léase: encontrar un cliente que me pague por hacer una aplicación) es JCR (Java Content Repository).
La JSR-170 especifica la forma en la que deberíamos comunicarnos con los repositorios de contenido. Los repositorios de contenido o "Content Management Systems" (CMS) como Documentum o Vignette nos permiten guardar información binaria o de texto sin tener que preocuparnos por dónde se hace, es decir si se utiliza una base de datos relacional o ficheros XML. Pero cada vendedor tiene su propio producto y su propia forma de acceder a la información, por lo que la JSR-170 trata de resolver el problema de la estandarización.
En el mundo open source, Apache JackRabbit es la implementación de referencia.
La información es organizada en nodos de un árbol, teniendo cada nodo "atributos" o "propiedades" donde guardar los datos. Por ejemplo, para guardar información podríamos (ejemplo tomado de aquí):

Session session = JackrabbitPlugin.getSession();
Node rootNode = session.getRootNode();
Node blogEntry = rootNode.addNode("blogEntry");
blogEntry.addMixin("mix:versionable");
blogEntry.setProperty(PROP_TITLE, blogEntryDTO.getTitle());
blogEntry.setProperty(PROP_BLOGCONTENT, blogEntryDTO.getBlogContent());
blogEntry.setProperty(PROP_CREATIONTIME, blogEntryDTO.getCreationTime());
blogEntry.setProperty(PROP_BLOGAUTHOR, blogEntryDTO.getUserName());
session.save();

Con lo que lograríamos crear un nodo, hacerlo versionable (uno de los servicios de la JSR), llenarlo con nuestra información y guardarlo.

Nunca se sabe, quizás en un futuro próximo convenza a alguien para utilizar Jackrabbit. Deséenme suerte!

domingo, noviembre 19, 2006

Pico y Spring


PicoContainer, alguien se acuerda de él? Es un contenedor de componentes que utiliza inyección de dependencias. Pero fue avasallado por el huracán Spring, aunque sigue teniendo sus adeptos incondicionales.
Y tan incondicionales que a veces (como otras tecnologías) se utiliza simplemente porque "es lo que sé", dejando de lado las "que no se" pero nos da mucha mas funcionalidad a nuestra arquitectura.
Pero como nada en esta vida es permanente (ni siquiera si utilizamos hibernate), y todo llega (incluso Java como open source), mi amigo Ale pudo finalmente "refactorizar" una aplicación para cambiar Pico por... Spring.

lunes, octubre 23, 2006

Un poco de Subversion en mi vida...

Emulando a algún blog por ahí, dejaré aquí los pasos necesarios al inicio de un proyecto para crear un repositorio en subversion.

  • Crear el repositorio
    svnadmin create c:\test\repo
  • Editar los ficheros "svnserve.conf" y "passwd"

    svnserve.conf:
    [general]
    anon-access = read
    auth-access = write
    password-db = passwd

    [miscellany]
    enable-auto-props = yes

    [auto-props]
    *.java = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.jsp = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.css = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.htm = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.html = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.xml = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.xsl = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.dtd = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.txt = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.properties = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL
    *.tld = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL

    passwd:
    [users]
    admin=admin

  • Crear los directorios de proyecto iniciales
    svn mkdir file:///c:/test/repo/MyProject -m "starting..."
    svn list file:///c:/test/repo

    svn mkdir file:///c:/test/repo/MyProject/trunk -m "starting..."
    svn list file:///c:/test/repo/MyProject

    svnlook tree c:/test/repo --show-ids

  • Importar los ficheros iniciales (seguro que a esta altura ya hay alguno)
    svn import C:/test/workspace/upmng file:///c:/test/repo/MyProject/trunk -m "test"

martes, julio 04, 2006

Procesadores post-instanciación en Spring 2.0

Debasish Ghosh nos enseña aquí un nuevo "feature" de Spring 2.0: la habilidad de realizar inyección de dependencias a beans que *no* han sido instanciados por Spring. Un buen ejemplo son los beans que genera Hibernate (o cualquier ORM) mediande *new*.

Esto se consigue con la anotación "@Configurable" o con "AnnotationBeanConfigurerAspect" para los que no desean utilizar anotaciones y el xml de beans de siempre:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans">

<aop:spring-configured/>

<bean id="myDao"
class="package.ChildrensDaoImpl"/>

<bean id="myClass" class="package.MyClass" lazy-init="true">
<property name="dao" ref="myDao" />
</bean>
</beans>

@Configurable("myClass")
public class MyClass {
private Dao dao;
public String getChildrens(...) {
List childrens = dao.find(...);
}
public void setDao(Dao dao) {
this.dao = dao;
}
}
Con esta configuración y un poco de *magia* AOP, logramos inyectar *service objects* en nuestros *domain objects*.

jueves, junio 22, 2006

Nueva canción: Java EE 5!

Roumen ha publicado una canción sobre Java EE 5. A little bit of injection in your life!

(via Erik)

Ladies and gentlemen, this is Java EE 5!

One, two, three, four, five
There's a technology I use day and night
For my application with a web frontend
They told me to use .Net
But I really don´t wanna

So many bugs I fixed last week.
My code is neat and talk is a cheap
I like Glassfish, JSF, persistence API
And as I continue you know they´re gettin´ sweeter

So what can I do I really beg you my Lord
To me codin' it´s just like a sport
All the bad code from the past, let me dump it
Please set in the trumpet

A little bit of injection in my life
A little bit of persistence by my side
A little bit of NetBeans is all I need
A little bit of EJB's what I see
A little bit of standards in the sun
A little bit of XML all night long
A little bit web services here I am
A little bit of code makes me real man

This is Java EE 5!

Jump up and down and move your code around
Shake your head to the sound bury bad code under ground
Move one step left and one step right
One to the front and one to the side
Refactor it once and refactor it twice
If it looks like this you're doin´ it right

A little bit of injection in my life
A little bit of persistence by my side
A little bit of NetBeans is all I need
A little bit of EJB's is what I see
A little bit of standards in the sun
A little bit of XML all night long
A little bit web services here I am
A little bit of code makes me real man

This is Java EE 5!