NuBuMu

Friday, October 31, 2008

Mas Lib Dependency Hell

La libreria MyFaces 1.2.x es una implementacion de JSF 1.2
La libreria MyFaces 1.1.x es una implementacion de JSF 1.1

JSF 1.2 requiere:
java 1.5 o posterior
JSP 2.1
JSTL 1.2
Java Servlet 2.5

Log4j

Soy tonto! me he pasado un buen rato intentando configurar el logging, y no habia manera... al final me he dado cuenta que falta la libreria del log4j... en fin.

mi log4j.xml de la muerte

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%d{dd/MM/yy hh:mm:ss:sss z}] %5p %c: %m%n" />
</layout>
</appender>
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/output.log"/>
<param name="MaxFileSize" value="1MB"/>
<param name="MaxBackupIndex" value="100"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%d{dd/MM/yy hh:mm:ss:sss z}] %5p %c{2}: %m%n" />
</layout>
</appender>

<logger name="org.apache">
<level value="WARN"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="org.springframework">
<level value="WARN"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="java.sql">
<level value="INFO"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="java.sql.Statement">
<level value="INFO"/>
<appender-ref ref="CONSOLE"/>
</logger>

<root>
<priority value="DEBUG"/>
<appender-ref ref="CONSOLE"/>
</root>
</log4j:configuration>

Thursday, October 16, 2008

myFaces + Tomahawk

Libraries:
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-digester-1.8.jar
commons-discovery-0.4.jar
commons-el-1.0.jar
commons-fileupload-1.2.1.jar
commons-lang-2.4.jar
commons-logging-1.1.1.jar
commons-validator-1.3.1.jar
jstl-1.2.jar
myfaces-api-1.2.3.jar
myfaces-impl-1.2.3.jar
tomahawk-1.1.6.jar


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>xMyFaces</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>/pages/index.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>

</welcome-file-list>
<context-param>
<param-name>javax.faces.STAGE_SAVING_METHOD</param-name>
<param-value>SERVER</param-value>
</context-param>

<!-- Listeners -->
<listener>
<listener-class>
org.apache.myfaces.webapp.StartupServletContextListener
</listener-class>
</listener>

<!-- Faces Servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<!-- Faces Servlet Mapping -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>

<filter>
<filter-name>extensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
</filter-mapping>
</web-app>

faces-config.xml

<faces-config>
<managed-bean>
<description>Test</description>
<managed-bean-name>test</managed-bean-name>
<managed-bean-class>uk.co.myfaces.test.Test</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<description>dataList</description>
<managed-bean-name>dataList</managed-bean-name>
<managed-bean-class>uk.co.myfaces.test.DataListBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<description>course</description>
<managed-bean-name>course</managed-bean-name>
<managed-bean-class>uk.co.myfaces.test.Course</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<navigation-rule>
<from-view>index.jsp</from-view>
<navigation-case>
<from-outcoume>success</from-outcoume>
<to-view-id>/pages/welcome.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
</faces-config>


DataListBean

package uk.co.myfaces.test;

import java.util.ArrayList;
import java.util.List;

public class DataListBean {

private List list = new ArrayList();

public List getList() {
return list;
}

public void setList(List list) {
this.list = list;
}

public List getData(){
return this.list;
}

public DataListBean() {
super();
list.add(new Course("Biology","C1",1));
list.add(new Course("Chemistry","C2",2));
list.add(new Course("English","C3",3));
list.add(new Course("Maths","C4",4));
list.add(new Course("Spanish","C5",5));
}

}



Welcome.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
<title>MyFaces</title>
</head>
<body>
<f:view>
<h1><h:outputText value="Welcome to MyFaces!" /></h1>

<h:form>

<t:panelTabbedPane serverSideTabSwitch="true">

<t:panelTab id="tab1" label="Calendar" rendered="true">
<t:inputCalendar id="secondOne"
monthYearRowClass="yearMonthHeader"
weekRowClass="weekHeader"
popupButtonStyleClass="standard_bold"
currentDayCellClass="currentDayCell"
value="#{userBacking.date}"
renderAsPopup="true"
popupTodayString="Hoy es:"
popupDateFormat="dd/MM/yyyy"
forceId="true"
renderPopupButtonAsImage="true"
/>
</t:panelTab>
<t:panelTab id="tab2" label="Data List" rendered="true">
<t:dataList var="course"
id="dataList" value="#{dataList.data}"
layout="simple">
<h:outputText value="#{course.name}" />

</t:dataList>
</t:panelTab>
</t:panelTabbedPane>


</h:form>
</f:view>
</body>
</html>

Facelets

Cuando se hizo JSF la intencion era usar JSP como la principal tecnologia para crear paginas. Por desgracia, JSP y JSF no se comlpementan el uno al otro. JSP se usa para crear contenido estatico o dinamico que se procesa de arriba a abajo pero no sirve para crear arboles de componentes.

JSF, por su parte, tiene un ciclo de vida mucho mas complejo que JSP y la generacion y el renderizado de los componentes ocurre en diferentes fases del ciclo.

Facelets se hizo para rellenar esa carencia. Es una tecnologia que permite crear arboles de componentes que, a la vez, puede intercambiar contenido con el complejo ciclo de vida de los JSF.

Facelets sustituye JSP con una API muy directa que refleja perfectamente sus principios de simplicidad, y a su vez, incorpora algunas funcionalidades para el desarrollador.

La cuestion esta que JSF 1.2 usa JSP 2.1, pero hay algunos application servers (tomcat 5.0.x, por ejemplo) que no lo soportan aun, asi que la manera de usar JSF en dichos servidores es mediante los facelets.

myFaces 1.2.3

Application Server: Tomcat 6.0.14

Librerias usadas:
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-digester-1.8.jar
commons-discovery-0.4.jar
commons-el-1.0.jar
commons-logging-1.1.1.jar
jstl-1.2.jar
myfaces-api-1.2.3.jar
myfaces-impl-1.2.3.jar
tomahawk-1.1.6.jar (esta no se utiliza en esta prueba)

Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>xMyFaces</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>/pages/index.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>

</welcome-file-list>
<context-param>
<param-name>javax.faces.STAGE_SAVING_METHOD</param-name>
<param-value>SERVER</param-value>
</context-param>

<!-- Listeners -->
<listener>
<listener-class>
org.apache.myfaces.webapp.StartupServletContextListener
</listener-class>
</listener>

<!-- Faces Servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<!-- Faces Servlet Mapping -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>

</web-app>

faces-config.xml

<faces-config>
<managed-bean>
<description>Test</description>
<managed-bean-name>test</managed-bean-name>
<managed-bean-class>uk.co.myfaces.test.Test</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<navigation-rule>
<from-view>index.jsp</from-view>
<navigation-case>
<from-outcoume>success</from-outcoume>
<to-view-id>/pages/welcome.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
</faces-config>


index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>MyFaces</title>
</head>
<body>
<f:view>
<h:form id="form">
<h:commandLink action="#{test.doTest}">Go to Welcome!</h:commandLink>
</h:form>
</f:view>
</body>
</html>

Welcome.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>MyFaces</title>
</head>
<body>
<f:view>
<h:outputText value="Welcome to MyFaces!" />
</f:view>
</body>
</html>

Test.class
package uk.co.myfaces.test;

public class Test {

public String doTest(){
return "success";
}
}

Mis dependencias

Uno de los problemas mas gordos que me he encontrado a la hora de trabajar con MyFaces y RichFaces es la dificultad para hacer el setup del proyecto. si, seguro que ahora aparece el tipico listillo que dice que Maven esto y lo otro y que el no tuvo ningun problema :)

Fine, pero yo, y muchos otros (a juzgar por los comentarios en las listas de myfaces) se las ven y las desean para empezar a "jugar" con estos frameworks.

Problemas? cada version de cada libreria depende de una serie de librerias muy cachondas ellas. Ademas, resulta que hay diferentes configuraciones para diferentes combinaciones. Asi, no es lo mismo usar MyFaces que usar MyFaces con los adorados Facelets.

Con RichFaces lo mismo. De hecho, que recomienden bajarse un war file y usarlo como template, pues ya lo dice todo.

Si la documentacion siempre ha sido un problema, ahora aun lo es mas. Por no decir que el hecho que maven ande por ahi complica las cosas en el sentido que se pierde las dependencias de las diferentes versiones.

Voy a intentar en diferentes posts ir poniendo las diferentes configuraciones que vaya probando. De momento, he llegado hasta MyFaces tomahawk + trinidad + facelets pero realmente creo que con tomahawk y el sandbox hay mas que suficiente :)

Friday, October 10, 2008

Apache MyFaces round 2

Bueno, despues de liarme la manta a la cabeza y probar los diferentes subproyectos, estas son mis conclusiones:

Tanto en Trinidad como en Orchestra me he encontrado un poco "encasillado". Cosas como, vale, que pasa si en lugar de tener esto asi quiero tenerlo asa... Pues poder se puede, pero cuesta demasiado. Realmente para proyectos empresariales esta muy bien, pero no es lo que ando buscando.

Aun no he conseguido que Tobago me funcione con los facelets... y empiezo a pensar si usar facelets es o no the way to go, pero vaya, por poco que pueda quiero hacerlo con facelets (quien dijo que manejar las dependencias con Maven era facil? pues la verdad, es facil una vez todo funciona, por que como no te funcione sufres hasta llorar).

Al fin y al cabo yo lo que quiero es mucha flexibilidad en cuanto al layout, unos poquitos controles (date, suggest, etc) y poco mas... y creo que todos estos frameworks no me ayudan gran cosa...

Mi consejo para quien empiece con ellos: paciencia. Empieza con versiones estables. Primero bajate el war file o haz que maven te lo cree si no tienes conflictos con las dependencias y a partir de ahi, una vez tengas un ejemplo funcionando, mira como esta configurado, pero cuidado que cada subproyecto es un poco diferente!

Yo cometi el error de mezclarlos todos y la que se lio fue parda... :) en fin, mis conclusiones: quedarme con Tomahawk y mirar de adaptar los controles que me gustan de otros subproyectos :D

Wednesday, October 08, 2008

El problema?

JSF 1.1 -> JSP 2.0 -> Tomcat 5.x
JSF 1.2 -> JSP 2.1 -> Tomcat 6.x
JSF 1.2 + Facelets -> Tomcats 5.x

Que dolor de cabeza con las dichosas dependencias!

MyFaces y sus amigos


Estos ultimos dias he estado probando MyFaces... Bueno, la cosa ha ido asi. Primero me miro JSF, ok, vale, let's do it! entonces, acto seguido digo, si uso JSF bien vale la pena probar MyFaces... alli que me voy, y pruebo el TomaHawk, y funciona! entonces miro y encuentro un componente que quiero en el Sandbox, asi que alla voy a instalar MyFaces Sandbox y PUMBA! todo a hacer punyetas...

Total, que he vuelto un pasito atras y estoy probando MyFaces Tobago. Realmente no tengo muy claro por donde tirar. Se lo que quiero, pero no se muy bien la arquitectura final... JSF y iBatis, pero que framework usar en la UI pos todavia no.

Mi experiencia? pues el famoso Maven y su gestion de dependencias hacen que precisamente esas dependencias sean un horror. Esta muy bien cuando tienes un fresh example, pero si tienes algo hecho y quieres anyadirle mas funcionalidad (por ejemplo, anyadir sandbox a tomahawk) es bastante doloroso.

Solucion? hacer un build de cada proyecto por separado. En eso estamos, haciendo el build de Tobago.

Thursday, October 02, 2008

Tomcat 6

Paso 1 - Instalamos Java

sudo apt-get install sun-java6-jdk

Paso 2 - Nos bajamos el Tomcat

wget http://apache.mirrors.redwire.net/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.tar.gz
tar xvzf apache-tomcat-6.0.18.tar.gz
sudo mv apache-tomcat-6.0.18 /usr/local/tomcat

Paso 3 - El Setup Tomcat para que arranque solito

sudo nano /etc/init.d/tomcat

#!/bin/bash

export JAVA_HOME=[path al Java_Jom]
export CATALINA_BASE=/usr/local/tomcat
export CATALINA_OPTS="-server -Xmx512m"
case $1 in
start)
sh /usr/local/tomcat/bin/startup.sh
;;
stop)
sh /usr/local/tomcat/bin/shutdown.sh
;;
restart)
sh /usr/local/tomcat/bin/shutdown.sh
sh /usr/local/tomcat/bin/startup.sh
;;
esac
exit 0

sudo chmod 755 /etc/init.d/tomcat
sudo update-rc.d tomcat defaults

Paso 4 - Arranca el Tomcat y prueba que funcione

sudo /etc/init.d/tomcat start

Evaluando Seam

Desde el momento que me decidi por Java, estaba claro que Spring y JSF iban a ser las vigas sobre las que construir una de las aplicaciones.

Como ya llevo tiempo escuchando esos cantos de sirena llamados Seam, pues ahi que me he ido a mirar a ver que se puede hacer con el susodicho framework de marras.

El update site para Eclipse: http://download.jboss.org/jbosstools/updates/stable

es un buen montoncito de Megas... La verdad es que ninguna de las dos aplicaciones es gran cosa, y no quiero complicarlo mucho. Al fin y al cabo, creo que con doce paginas y otros pocos de beans la cosa se resuelve... de momento lo descargo y a ver que dice mi Eclipse :D

De momento la arquitectura va a ser:
SpringFramework + Spring MVC (no uso webflow por que realmente no me hace falta).
iBatis (no me gusta hibernate, prefiero disenyar yo mis tablas... :) vale, llamame raro).
JSF

Mas, en otro momento, que ahora toca coffee :D

Eclipse 3.4 en Ubuntu

La version 3.4 de eclipse aun no esta en los repositorios, pero eso no quiere decir que no se pueda instalar :)

>sudo apt-get install openjdk-6-jdk
> wget http://ftp.osuosl.org/pub/eclipse/technology/epp/downloads/release/ganymede/R/eclipse-java-ganymede-linux-gtk.tar.gz
> tar xzvf eclipse-java-ganymede-linux-gtk.tar.gz
> mv eclipse eclipse3.4