martes, 13 de noviembre de 2007

linux script copias seguridad

estos scripts se activan desde el archivo crontab


copidatabases.sh (mysql)

#!/bin/sh
fecha=$(date +%y-%m-%d-%H-%M)
DIRECTORIO_INICIAL=/var/lib/mysql
DIRECTORIO_FINAL=$1

mkdir $DIRECTORIO_FINAL/$fecha
for a in `ls $DIRECTORIO_INICIAL`
do
fname=`echo $a | tr A-Z a-z`

echo $DIRECTORIO_INICIAL/$a $DIRECTORIO_INICIAL/$fname
/usr/bin/mysqldump -u ADMIN --password=nickel $fname>$DIRECTORIO_FINAL/$fecha/$fname.sql
done;
exit 0

copi.sh (directorios a incluir y tar)
#!/bin/sh
DIAS=$3
DIRECTORIO_INICIAL=$1
DIRECTORIO_FINAL=$2
fecha=$(date +%y-%m-%d-%H-%M)
find $DIRECTORIO_INICIAL -mtime -$DIAS \! -type d | cat > $DIRECTORIO_FINAL$fecha.txt
tar -cv -T $DIRECTORIO_FINAL$fecha.txt -f $DIRECTORIO_FINAL$fecha.tar

jueves, 8 de noviembre de 2007

cache de explorer no busca actualizacion de informacion

En herramientas>opciones de internet
pestaña general, información relativa a archivos temporales de internet> configuración
Comprobar: automaticamente

o eso o mandar un parametro en el get que sea por ejemplo la hora

miércoles, 24 de octubre de 2007

enum con propiedades, para controlar los mensajes al usuario

http://java.sun.com/docs/books/tutorial/java/javaOO/enum.html

public enum ReflectionMensaje {
ILEGAL_ACCESO("ilegal acceso al metodo: "),
METODO_INEXISTENTE("No existe el metodo: "),
EXCEPCION_INVOCACION("excepcion de invocacion en el metodo: ");

private final String mensaje; // in kilograms

ReflectionMensaje(String m) {
this.mensaje = m;
}

public String toString() {
return mensaje; //To change body of overridden methods use File | Settings | File Templates.
}
}

jueves, 18 de octubre de 2007

configure log en jboss

hay que editar el archivo server/default/conf/log4j.xml
e incluir nuevas categorias

<category name="oracle.adf">
<priority value="WARN"/>
</category>

martes, 16 de octubre de 2007

jndiPatter en components.xml

<component name="org.jboss.seam.core.init">
< property> name="jndiPattern" pruebaSevilla/#{ejbName}/local/ <property>
</component>

miércoles, 10 de octubre de 2007

Acceder a componente stateless de seam

como es un componente sin estado no se puede acceder a través de la función:
Contexts.getSessionContext()
entonces:
Component.getInstance(nombre);

jueves, 4 de octubre de 2007

How to specify platform independent file path?

How to specify platform independent file path?
WINDOWS
File.separatorChar: \
File.separator: \
File.pathSeparator: ;
File.pathSeparatorChar: ;

LINUX
File.separatorChar: /
File.separator: /
File.pathSeparator: ;
File.pathSeparatorChar: ;


Y una función para obtener el path url del archivo:
protected String damePathURL(String serverPathFile){
try{
return serverPathFile.replaceAll(File.separator, "/");
}catch(Exception e){
//lanzaría una excepción de tipo java.util.regex.PatternSyntaxException al intentar sustituir el File.Separator=\
return serverPathFile.replaceAll(File.separator+File.separator, "/");
}
}

martes, 2 de octubre de 2007

Mailing en seam

El ejemplo de seam-mail muestra como funciona la libreria jboss-seam-mail.jar


Basicamente hay que añadir el componente :
mail:mail-session host="smtpHost" username="user" password="password"
en el archivo WEB-INF/components.xml

y en el archivo jsf, la declaración de tld
xmlns:m="http://jboss.com/products/seam/mail"

jueves, 20 de septiembre de 2007

Actualiza richfaces3.1 en seam

Simplemente hay que quitar la librería actual de richfaces sustituirla por las 3 nuevas que trae la actualización:

  • richfaces-ui-3.1.0.jar
  • richfaces-api-3.1.0.jar
  • richfaces-impl-3.1.0.jar
y eliminar la actual: ajax4jsf*.jar que ya está contenida en la actualización de las anteriores

por mi parte he incluído el modulo en application.xml
>module >
>java >richfaces-api-3.1.0.jar >/java >
>/module >


encontrado en el forum de jboss-seam:
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=118650

linux symbolic link


ln -s [TARGET DIRECTORY OR FILE] ./[SHORTCUT]
ln -s /usr/local/apache/logs ./logs

viernes, 14 de septiembre de 2007

Volver a linkear un directorio con subversion en google.code

Borrar todas las carpetas presentes en ese directorio con nombre .svn y después seleccionar share directory

martes, 11 de septiembre de 2007

internacionalización en jboss seam, varios ficheros de mensajes, herencia

Hay que incluir el componente en el components.xml
distinguiendo los nombres de cada grupo de mensajes

<core:resource-bundle>

<core:bundle-names>

<value>messages</value>

<value>zmessages</value>

</core:bundle-names>

</core:resource-bundle>



Para acceder desde el jsf dos formas (en la mayoría de las ocasiones la mejor es la segunda):

  1. a través del mapa de mensajes #{messages['mensajeUsuario']}
  2. a través de la sintaxis de punto #{messages.mensajeUsuario}

Para acceder al componente de Messages desde la fase de invocación del programa (es decir siempre que no sea en el jsf esto es en las clases java que escribimos) hay que acceder de la siguiente forma:
Stringn mensajeInternacionalizado=Messages.instance().get('mensajeUsuario')


Persistencia de propiedades de tipo Objeto no primitivo: Annotation Type Embedded

Hay que anotar la propiedad objeto con la anotacion @Embedded. Y el objeto en cuestión con la anotacion @Embeddable.
Ej:
@Embedded
ClienteImagen fichero

@Embeddable
public class ClienteImagen {

String imgMini;
String imgZoom;


public String getImgMini() {
return imgMini;
}

public void setImgMini(String imgMini) {
this.imgMini = imgMini;
}

public String getImgZoom() {
return imgZoom;
}

public void setImgZoom(String imgZoom) {
this.imgZoom = imgZoom;
}
}




http://tom.tharrisx.homedns.org/sm3rdpartyref/hibernate-annotations-3.3.0.GA/doc/jpa-api/javax/persistence/Embedded.html

lunes, 10 de septiembre de 2007

language in lunux, locales

/etc/environment

LANGUAGE="de_DE:de:en_GB:en"
LANG=de_DE@euro


LC_ALL=es_ES@euro
LANGUAGE=es_ES@euro
LC_TYPE=es_ES@euro
LANG=es_ES@euro

export LANG=de_DE@euro

Esto lanza un programa para reconfigurar las locales:
dpkg-reconfigure locales


En este momento las tengo en:
locale
LANG=de_DE@euro
LC_CTYPE="de_DE@euro"
LC_NUMERIC="de_DE@euro"
LC_TIME="de_DE@euro"
LC_COLLATE="de_DE@euro"
LC_MONETARY="de_DE@euro"
LC_MESSAGES="de_DE@euro"
LC_PAPER="de_DE@euro"
LC_NAME="de_DE@euro"
LC_ADDRESS="de_DE@euro"
LC_TELEPHONE="de_DE@euro"
LC_MEASUREMENT="de_DE@euro"
LC_IDENTIFICATION="de_DE@euro"
LC_ALL=

domingo, 9 de septiembre de 2007

jboss jems installer sin interface grafica (en servidor)

link:http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4025336
java -jar jems-installer-1.2.0.jar -installGroup ejb3-clustered
installpath=/opt/jboss-4.0.5

jueves, 6 de septiembre de 2007

Cambiar nombre de tabla en mysql

ALTER TABLE `nombre` RENAME `NombreNuevo` ;

martes, 4 de septiembre de 2007

Character-set en jboss requestURI

http://www.jboss.com/index.html?module=bb&op=viewtopic&t=107804

Connector port="8080" address="${jboss.bind.address}" useBodyEncodingForURI="true" URIEncoding="UTF-8"
maxThreads="250" strategy="ms" maxHttpHeaderSize="8192"
emptySessionPath="true"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"

viernes, 31 de agosto de 2007

articulos interesantes para programar en java con herramientas actuales

http://shrubbery.mynetgear.net/

jueves, 30 de agosto de 2007

Foro de discusión de Google Calendar

http://groups.google.com/group/google-calendar-help-dataapi

Pruebas de unidad en Jboss Seam, implementar org.jboss.seam.log.Log con org.apache.commons.logging.Log

Si intentamos probar un componente de Jboss Seam en aislamiento/unidad y este componente tiene una Log inyectado por Seam, tendremos un nullexception al lanzar la prueba, aquí dejo un ejemplo en el que creamos una clase que implementa org.jboss.seam.log.Log y que accede a org.apache.commons.logging.Log

public class BeanTest {

@Test
public void testBean(){
Bean bean=new Bean();
bean.log=new Logger();
bean.run();
}

}
class Logger implements org.jboss.seam.log.Log{
Log log = LogFactory.getLog(BeanTest.class);

public boolean isDebugEnabled() {
return log.isDebugEnabled();
}

public boolean isErrorEnabled() {
return log.isErrorEnabled();
}

public boolean isFatalEnabled() {
return log.isFatalEnabled();
}

public boolean isInfoEnabled() {
return log.isInfoEnabled();

}

public boolean isTraceEnabled() {
return log.isTraceEnabled();
}

public boolean isWarnEnabled() {
return log.isWarnEnabled();
}

public void trace(Object object, Object... params) {
log.trace(object);
}

public void trace(Object object, Throwable t, Object... params) {
log.trace(object,t);
}

public void debug(Object object, Object... params) {
log.debug(object);
}

public void debug(Object object, Throwable t, Object... params) {
log.debug(object,t);
}

public void info(Object object, Object... params) {
log.info(object);
}

public void info(Object object, Throwable t, Object... params) {
log.info(object,t);

}

public void warn(Object object, Object... params) {
log.warn(object);
}

public void warn(Object object, Throwable t, Object... params) {
log.warn(object,t);

}

public void error(Object object, Object... params) {
log.error(object);

}

public void error(Object object, Throwable t, Object... params) {
log.error(object,t);
}

public void fatal(Object object, Object... params) {
log.fatal(object);
}

public void fatal(Object object, Throwable t, Object... params) {
log.fatal(object,t);
}
}

miércoles, 29 de agosto de 2007

Obtener el url abosulto de una imagen en Picasa

MediaGroup group = photoEntry.getExtension(MediaGroup.class);
List thumbnails = group.getThumbnails();
MediaThumbnail thumbnail = thumbnails.get(0);
String url = thumbnail.getUrl();

información obtenida de:
foro de discusion de picasa

Foro de discusion de Picasa

http://groups.google.com/group/Google-Picasa-Data-API/

viernes, 24 de agosto de 2007

Combinar edición FCKeditor con Blogger

Para que cuando seleccionemos un item en fckeditor nos incluya el path completo podemos incluir estas lineas de código dentro de la función existente OpenFile( fileUrl ) en el archivo:

FCKeditor\editor\filemanager\browser\default\frmresourceslist.html

function OpenFile( fileUrl )
{
var var1=document.URL.substr(0,document.URL.indexOf('/editor/'));
var lugar=resultado.lastIndexOf('/');
var pathServidor=resultado.substr(0,lugar);
window.top.opener.SetUrl( pathServidor+fileUrl ) ;
window.top.close() ;
window.top.opener.focus() ;
}

Con esta modificación en el fckeditor, si lo utilizamos para editar entradas de blog, nos mantendrá el url completo al servidor adecuado. Esto funcionará en links a archivos

miércoles, 22 de agosto de 2007

Obtener el contenido de una entrada de blogger

TextContent tc = (TextContent)entry.getContent();
HtmlTextConstruct ptc = (HtmlTextConstruct)tc.getContent();
System.out.println(ptc.getHtml());

jueves, 9 de agosto de 2007

Mostrar espacio usado en directorios

En esta instrucción primero se llama al comando du para mostrar el espacio usado por el direcotorio /usr/javatools después se (tee)envia al archivo analisis/data y por ultimo se muestra por pantalla con la utilidad more dicho archivo
du -b 10000 /usr/javatools/ | tee analisis/data | more

du -sk *

wikipedia

miércoles, 11 de julio de 2007

Pasar un parametro en jsf

Para no sobrecargar las llamadas al servidor desde el renderizado de la página jsf, podemos guardar valores dentro del componente ui:param de xmlns:ui="http://java.sun.com/jsf/facelets"

<ui:param name="path" value="../"/>

y en el resto de la página solamente llamaremos a #{path}

martes, 10 de julio de 2007

Acceder a componente core.manager y core.ConversationEntries en PhaseId.INVOKE_APPLICATION

Para acceder a la lista de conversaciones desde nuestro código java y pretendemos hacerlo de la forma
@In
Manager manager

Nos dará error de illegalArgumentException cuando instancie el componente.
Para solucionarlo podemos acceder directamente con:
Manager manager = Manager.instance();
ConversationEntries conversationEntries = ConversationEntries.instance();

y de esta forma tendremos las conversaciones (ConversationEntry ) y toda su funcionalidad :
for(ConversationEntry idConversacion:conversationEntries.getConversationEntries()) {
if(idConversacion.isCurrent())log.error("cURRENT!!");
log.error("idConversacion_"+idConversacion.getId()+" view"+idConversacion.getViewId());
}

jueves, 5 de julio de 2007

Interfaces en ejb3, herencia

El componente Seam con estado tiene una interfaz pública por lo cual obtendremos un error si intentamos implementar varias interfaces solo desde la implementación y no desde la interface.

ej mal hecho--- > ERROR:
public interface CatalogoAction {
...
}

public class CatalogoActionImpl implements Serializable, CatalogoAction, ListadoResultados{
....
}


ej bien hecho:

public interface CatalogoAction extends ListadoResultados {
}

public class CatalogoActionImpl implements Serializable, CatalogoAction{
....
}

martes, 3 de julio de 2007

No funciona el estado del componente cuando se intenta cambiar un valor

Cuando intento cambiar una propiedad de un componente con estado a través de sus metodos get/setter que se definen en la interface, no funciona!
Tenía un problema con la etiqueta h:form, había 1 formulario dentro de otro y eso hacía el error

SelectOneMenu con entidades y valor nulo

<h:selectOneMenu value="#{search.category}">

<s:convertEntity />

<ui:remove> <f:selectItem itemLabel="Any" itemValue="#{anyCategory}" /></ui:remove>

<s:selectItems value="#{allCategories.resultList}" var="category"

label="#{category.name}"

noSelectionLabel="ANY" />

</h:selectOneMenu

Recargar factoria de elementos al acabar una conversación

Para recargar una factoría de objetos que tendremos cargados en session para optimizar el rendimiento de la base de datos, podemos utilizar los eventos, los cuales al finalizar una tarea/conversación se pueden encargar de forma transparente (programación orientada a aspectos) de acceder a variables de otros componentes para su inicialización.
Ejemplo:
al finalizar un pedido de compra se necesita que el catalogo de productos muestre el stock actualizado.

public class CheckOutBean implements CheckOut, Serializable{
...
@End
@RaiseEvent("limpiarCatalogo")
public void enviarPedido() {
persist.order()

}
}

public class CatalogoBean implements Serializable, Catalogo {
...

@Observer("limpiarCatalogo")
public void limpiarPiezas(){
log.error("RESET CATALOGO ");
piezasList=null;

}
}


**** Esto puede parecer obvio, pero si lo que hacemos es recargar la colección en vex de limpiarla no funcionará, ya que la transacción depende de las phases de jsf, es decir que no se producirá la actualización hasta que no se salga de la PhaseId.INVOKE_APPLICATION.

Eventos en Seam

Seam contempla varios modelos de eventos:

  • JSF eventos
    • <h:commandButton value="enviar" action="#{helloWorld.sayHello}"/>
  • jBPM transition events (.jpdl), se especifican en la etiqueta event en la cual hay que definir el tipo de evento (node-enter, node-leave, process-start, process-end, task-create, task-assign, task-start, task-end, before-signal, after-signal). Hay que distinguir entre bussiness process (varios usuarios implicados) y pageflow (un usuario)
    • <event type="">
  • Seam page actions (pages.xml), se ejecutan antes del renderizado de una página
    • <pages>
      <page view-id="hello.jsp" action="#{helloWorld.sayHello}"/>
      </pages>

  • Seam component-driven events
    • se puede definir en el archivo components.xml o en el propio código java a través de anotaciones o referencias a componentes propios de Seam es decir Events.instance
      • anotacion para observar un evento @Observer("nombreEvento")
      • anotación para lanzar un evento @RaiseEvent("nombreEvento")
  • Seam contextual events
    • componentes Seam siempre instalados
      • preSetVariable, postSetVariable, preRemoveVariable ...
En @RaiseEvent(value="nombreEvento")
se produce cuando el metodo devuelve un not-null y sin excepciones!

lunes, 2 de julio de 2007

¿qué es un pageflow?

Pageflow podríamos definirlo como definición de proceso o flujo de negocio. Para su representación se utiliza jPDL que tiene sintaxis XML y puede editarse gráficamente con un plugin de eclipse. En dicha representación se concretan los diferentes estados, decisiones, tareas, páginas web, etc con las cuales interactua el usuario.

Existen dos formas de definir un pageflow en Seam:

  1. Sin estado - faces-config.xml /pages.xml
  2. Con estado - jPDL

continuará ....

viernes, 29 de junio de 2007

DataModelSelection en Conversation context problem

Después de mucho probar me he dado cuenta que el datamodelselection funciona en un contexto de session

jueves, 28 de junio de 2007

Interceptar toda la aplicacion en Seam

Podemos utilzar la filosofía de Seam de interceptar todo, para cronometrar nuestra aplicación y comprobar en que métodos se producen retardos.

  1. Creamos una clase que extienda de org.jboss.seam.ejb.SeamInterceptor es decir la clase que utiliza Seam para interceptar los componentes de la aplicacion:
    • public class MiaoInterceptor extends SeamInterceptor {

      @AroundInvoke
      public Object aroundInvoke(InvocationContext invocation) throws Exception
      {

      if(invocation.getTarget().getClass().getPackage().toString().contains("es.miao")){
      long l = System.currentTimeMillis();

      String invocacion=invocation.getTarget().getClass().getSimpleName()+"."+invocation.getMethod().getName()+"()";
      System.out.println("INICIANDO: "+invocacion);

      Object o = invocation.proceed();
      long ll = System.currentTimeMillis();

      System.out.println("FINALIZANDO: "+invocacion+" Tiempo total: "+(ll-l)+" milisegundos");

      return o;
      }
      return invocation.proceed();
      }

      }
  2. Cambiar en el ejb-jar.xml el interceptor de seam por el nuestro
    • <?xml version="1.0" encoding="UTF-8"?>
      <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
      version="3.0">
      <interceptors>
      <interceptor>
      <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
      </interceptor>
      <interceptor>
      <interceptor-class>es.miao.MiaoInterceptor</interceptor-class>
      </interceptor>
      </interceptors>
      <assembly-descriptor>
      <interceptor-binding>
      <ejb-name>*</ejb-name>
      <interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
      </interceptor-binding>
      <interceptor-binding>
      <ejb-name>*</ejb-name>
      <interceptor-class>es.miao.MiaoInterceptor</interceptor-class>
      </interceptor-binding>
      </assembly-descriptor>
      </ejb-jar>

InstantiationException: Configurar intelli jidea para correr pruebas de seam

Un problema es que el seam necesita que en el directorio donde se copian todos los recursos empleados exista el security.drl, y esto se hace settings>compiler>resource patterns e incluir ?*.drl;

además hay que copiar persistence-text.xml a persistence.xml, esto lo hace el archivo ant del seam, pero hay que indicarselo al intellijidea. se puede hacer configurando la prueba para que corra una tarea ant antes de arrancar.

miércoles, 27 de junio de 2007

Alta de autonomo en epigrafe de programador en sevilla

Hacienda al lado de la casa de la moneda
La seguridad social en calle castelar mapa

  1. darse de alta en el IAE (Impuesto de actividades económicas)
    • Mostrador 16 pedir modelo 036
    • pedir número para declaración censal
    • entregar modelo cumplimentado
      • epigrafe 762 Programador
  2. ir a la seguridad social
    • fotocopiar el 036 sellado
    • llevar el numero de cuenta para domiciliación
    • llevar el número de la seguridad social
    • el epigrafe en seguridad social es el 72210:Edición de programas

martes, 26 de junio de 2007

jbpm en seam

primer ejemplo a seguir el numberguess example de seam aunque también está el dvd-store

hay que definir el componente de la definición del proceso en el components.xml:

<component class="org.jboss.seam.core.Jbpm">
<property name="pageflowDefinitions">
<value>pageflow.jpdl.xml</value>
<value>cheat.jpdl.xml</value>
</property>
</component>


y posteriormente la definición del proceso en este caso de cheat.jpdl

<pageflow-definition xmlns="http://jboss.com/products/seam/pageflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://jboss.com/products/seam/pageflow http://jboss.com/products/seam/pageflow-1.2.xsd"
name="cheat">

<start-page name="confirm" view-id="/confirm.jspx">
<transition name="yes" to="cheat">
<action expression="#{numberGuess.cheated}"/>
</transition>
<transition name="no" to="end"/>
</start-page>

<page name="cheat" view-id="/cheat.jspx">
<redirect/>
<transition to="end"/>
</page>

<page name="end" view-id="/numberGuess.jspx">
<redirect/>
<end-conversation/>
</page>

</pageflow-definition>


y en el pages.xml arrancamos el pageflow

<pages>
<page view-id="/numberGuess.jspx">
<begin-conversation join="true" pageflow="numberGuess"/>
</page>
<page view-id="/confirm.jspx">
<begin-conversation nested="true" pageflow="cheat"/>
</page>
</pages>

aunque también se puede arrancar desde el componente

@Create
@Begin(pageflow="numberGuess")
public void begin(){
...

}


pages.xml navegacion

Entre las razones de elegir el pages.xml para definir la navegación se encuentran:

  1. la posibilidad de especificar valores del request en la redirección
  2. comenzar o acabar una conversación desde la evaluación de una regla
  3. avaluar cualquier expressión de tipo EL

Para ver el empleo del pages.xml se puede ojear lo que produce el seam-jems generate-entities



Utilizar reglas de navegacion con pages.xml

lo que en faces-config.xml se escribiría así:

<navigation-rule>
<from-view-id>/editDocument.xhtml</from-view-id>
<navigation-case>
<from-action>#{documentEditor.update}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/viewDocument.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>


lo que en pages.xml quedaría así:

<pageview-id="/editDocument.xhtml">
<navigationfrom-action="#{documentEditor.update}"
evaluate="#{documentEditor.errors.size}">
<ruleif-outcome="0">
<redirectview-id="/viewDocument.xhtml"/>
</rule>
</navigation>
</page>


o incluso

<pageview-id="/editDocument.xhtml">
<navigationfrom-action="#{documentEditor.update}">
<ruleif="#{documentEditor.errors.empty}">
<redirectview-id="/viewDocument.xhtml"/>
</rule>
</navigation>
</page>

Gestión de errores en Seam

Con la etiqueta "restrict" me parece que se produce una redirección una vez que se salva la condición?

Ejemplo de Seam util para investigar: blog,
en este no se recoge la excepción en el pages.xml, unicamente la clase de excepción EntryNotFoundException tiene las etiquetas:
@ApplicationException(rollback=true)
@HttpError(errorCode=HttpServletResponse.SC_NOT_FOUND)
y entonces y con el web.xml:

<error-page>
<error-code>404</error-code>
<location>/seam/404.xhtml</location>
</error-page>

directamente busca el 404.xhtml

Las excepciones heredan de RuntimeException
y se producen en la invocación de un metodo jsf, es decir metodo público que no devuelve nada.
ejemplo metodo jsf que lanza excepción:
public void buscar(){
....
thrown new RuntimeException("algo ha fallado");
....
}

ademas se pueden producir a través del pages.xml con la etiqueta "restrict" o con "action" dentro de "page"

<page view-id="/gestion/*">
<restrict>#{authenticator.admin}</restrict>
</page>

<exception class="es.miao.MiaoExcepcion">
<redirect view-id="/error.xhtml">
<message>ha funcionado la runtime exception</message>
</redirect>
</exception>


Se supone que al entrar en cualquier pagina que se corresponda con el patrón "/gestion/*" es decir todas aquellas que se encuentren en la carpeta gestion, serán restringidas a que el componente authenticator responda afirmativamente al metodo isAdmin().
De lo contrario la etiqueta restrict se encarga de llevar a la página de error correspondiente.

<exception class="org.jboss.seam.security.NotLoggedInException">
<redirect view-id="/login.xhtml">
<message>#{messages.masInfo}</message>
</redirect>
</exception>

Con "restrict" es el componente Identity el que se encarga de evaluar la expressión y lanzar la correspondiente excepción, también podríamos obtener una excepción de la etiqueta "action"
<action execute="#{catalogoAction.disminuye}" />

Se supone que las acciones jsf no devuelven nada como resultado return void. Sin embargo la etiqueta restrict espera un boolean [boolean isAdmin(), ó , boolean isChecked()]



Seam componentes (traduccion de seam tutorial)

Existen 4 tipos de componentes:

  1. EJB 3.0 stateless session beans
  2. EJB 3.0 stateful session beans
  3. EJB 3.0 entity beans
  4. JavaBeans
  5. EJB 3.0 message-driven beans
Los EJB 3.0 stateless session beans:
Beans sin estado, se suelen usar como jsf listeners.
Contexto: stateless context

Los EJB 3.0 stateful session beans:
Son componentes con estado
Por defecto su contexto es de conversación, unicamente no puede estar en el contexto de página o stateless context.
Cuando están es contexto de sessión son siempre serializados por Seam

Los EJB 3.0 Entity Beans:
Son los beans que representan a las entidades persistentes.
Debido a que tienen una identidad en el contexto de seam y además una entidad en la persistencia, se suelen instanciar en el propio código java en lugar de instanciarlos Seam.
Estos beans no soportan la biyección.
Por defecto son de Contexto de conversación. No pueden ser stateless (Sin estado).

...




(Interceptores)Factorias de session que se recargan según eventos:

De esta forma no recargamos las llamadas a la base de datos:

@Stateful
@Scope(SESSION)
@Name("bookingList")
@Restrict("#{identity.loggedIn}")
@TransactionAttribute(REQUIRES_NEW)
public class BookingListAction implements BookingList, Serializable
{
.......

@Factory
@Observer("bookingConfirmed")
public void getBookings()
{
bookings = em.createQuery("select b from Booking b where b.user.username = :username order by b.checkinDate")
.setParameter("username", user.getUsername())
.getResultList();
}
........
}
@Stateful
@Name("hotelBooking")
@Restrict("#{identity.loggedIn}")
public class HotelBookingAction implements HotelBooking
{
...

@End
public void confirm()
{
em.persist(booking);
facesMessages.add("#{messages.gracias}, #{user.name}, your confimation number for #{hotel.name} is #{booking.id}");
log.info("New booking: #{booking.id} for #{user.username}");
events.raiseTransactionSuccessEvent("bookingConfirmed");
}
...
}

Pages.xml param converter Entity Id as Page Parameters

Al utilizar el seam framework:entity-home
<framework:entity-home name="empresaCasa" entity-class="es.miao.Empresa" >
<framework:id >#{param.empresaId}</framework:id>
</framework:entity-home>


Me daba un error de hibernate de conversión, se esperaba un long (el id de empresa) y se recibe un string. En la documentación de Seam viene que se pueden añadir conversores a los parametros recibidos, en este caso había que aclarar en el pages.

<page view-id="/gestion/empresa.xhtml">
<param name="empresaId" value="#{empresaCasa.id}" converterId="javax.faces.Long" />
</page>

lunes, 25 de junio de 2007

Hibernate anotar una enumeracion

public enum Status {OPEN,CANCELLED,PROCESSING,SHIPPED}

@Column(name="STATUS")
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}

viernes, 22 de junio de 2007

Conversaciones en Jboss Seam

Se puede entender por una conversación en Seam algo muy parecido de lo que hacemos cuando conversamos entre personas.
Existe un lugar (AplicationContext), un tiempo (SessionContext) y después una serie de objetos implicados en la conversación. Entre los objetos implicados en la conversación se encuentra el usuario, que participa a través de eventos, de tipo:

  • JSF
  • jBMP
  • Seam page actions
  • Seam component-drive events
Los eventos implican manejar las excepciones que se derivan de estos , novedad en el seam 1.6


El objeto ConversationEntry tiene una serie de propiedades que usaremos al cambiar de conversación. Entre elllas el viewId, es decir en nuestro caso, la página jsf. Igualmente tiene el metodo select(), que cambia la conversación seleccionada a la conversación actual.



Las clases implicadas son:
org.jboss.seam.core.ConversationEntry
org.jboss.seam.core.ConversationList
org.jboss.seam.core.Manager

jueves, 21 de junio de 2007

interesante en seam

Limitaciones/validaciones en inputs jsf y seam:
@NotNull(message="Credit card number is required")
@Length(min=16, max=16, message="Credit card number must 16 digits long")
@Pattern(regex="^\\d*$", message="Credit card number must be numeric")



Añadir un mensaje a un control jsf a través del componente facesMessages de Seam

facesMessages.addToControl("verify", "Re-enter new password");
facesMessages.addToControl("username", "Username #{user.username} #{messages.traducciones}");
* notar que podemos hacer referencia a un componente a traves del lenguaje EL

Añadir un contador con interceptores
esto se hace a través del pages.xml

<page view-id="*">
<action execute="#{blog.hitCount.hit}"/>
</page>

Obtener la pagina actual desde cualquier componente
javax.faces.context.FacesContext.getCurrentInstance().getViewRoot().getViewId()

Obtener info del contexto para upload y directorios de imgs
facesContext.externalContext.requestContextPath

i18n, se puede acceder a través de la clase java, y el mismo properties puede tener referencias EL
facesMessages.addFromResourceBundle("Hello");
Hello=Hello,#{user.firstName}#{user.lastName}

Inyectar de forma dinámica objetos en cada contexto (extraído de ejemplo de DVD Store)
@In Context sessionContext;
private static final String USER_VAR = "currentUser";
function void xxx(){
Object found=dao.get(xx)
sessionContext.set(USER_VAR, found);
}
ya está inyectado el objeto found en el contexto de session.











miércoles, 20 de junio de 2007

Obtener el hibernate Session desde EntityManager

javax.persistence.EntityManager ---------> org.hibernate.Session

Para utizar la API de hibernate desde el EntityManager inyectado desde Seam

@PersistenceContext
private EntityManager em;


Session session = ((HibernateEntityManager) em.getDelegate()).getSession();

lunes, 18 de junio de 2007

UnifiedExpressionLanguage operador &&

El operador "&&" se cambia a "and"

http://java.sun.com/javaee/5/docs/tutorial/doc/JSPIntro7.html


not empty
empty

la expresión quedaría de la siguiente forma: #{empty cart.cart}

Convertir byte[] a archivo

File file = new File(name);
file.createNewFile();
FileInputStream fileInputStream = new FileInputStream(name);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
OutputStream outputStream = new FileOutputStream(
name);
int data;
while ((data = byteArrayInputStream.read()) != -1) {
outputStream.write(data);
}

fileInputStream.close();
outputStream.close();

jueves, 14 de junio de 2007

s:link uso de esta etiqueta de seam

<s:link value="#{msg.title}" action="#{messageManager.select}"/>


@Stateful
@Scope(SESSION)
@Name("messageManager")
public class MessageManagerBean implements Serializable, MessageManager
{
public void select()
{
if (message!=null) message.setRead(true);
}

}

miércoles, 13 de junio de 2007

Ejemplo heritance jpa

package es.miao;

import java.io.Serializable;
import javax.persistence.*;

import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;

@Entity
@Table(name = "color_primaria")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="tipo", discriminatorType=DiscriminatorType.STRING, length=3)
@DiscriminatorValue(value="PRI")
public class CombinacionColorPrimaria implements Serializable {

//seam-gen attributes (you should probably edit these)
private Long id;
private Integer version;
private Color color;

//add additional entity attributes

//seam-gen attribute getters/setters with annotations (you probably should edit)

@Id @GeneratedValue
public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

@Version
public Integer getVersion() {
return version;
}

private void setVersion(Integer version) {
this.version = version;
}

@ManyToOne
public Color getColor() {
return color;
}

public void setColor(Color color) {
this.color = color;
}


}


package es.miao;

import java.io.Serializable;
import javax.persistence.*;

import org.hibernate.validator.Length;

@Entity
@DiscriminatorValue(value="SEC")
public class CombinacionColorSecundaria extends CombinacionColorPrimaria implements Serializable {






}

DiscriminatorColumn problem

@DiscriminatorColumn(name="tipo", discriminatorType=DiscriminatorType.STRING, length=20)
@DiscriminatorValue(value="PRIM")

No hay que poner en la clase java la propiedad!

anotaciones colecciones persistencia

@OneToMany(mappedBy="aplicacion", cascade=CascadeType.ALL)
public List getPiezas() {
return piezas;
}

@ManyToOne
public Aplicacion getAplicacion() {
return this.aplicacion;
}



@ManyToMany(targetEntity=GrupoMusica.class)
@JoinTable(name="MUSICOSENGRUPO",
joinColumns=
@JoinColumn(name="musico_ID", referencedColumnName="id"),
inverseJoinColumns=
@JoinColumn(name="grupo_ID", referencedColumnName="id"))
public List getGrupos() {
return grupos;
}


@ManyToMany(targetEntity=Musico.class)
@JoinTable(name="MUSICOSENGRUPO",
joinColumns=
@JoinColumn(name="grupo_ID", referencedColumnName="id"),
inverseJoinColumns=
@JoinColumn(name="musico_ID", referencedColumnName="id"))
public List getMusicos() {
return musicos;
}


s:convertEntity: Utilizar un selectitems en seam 1.2

<h:selectOneMenu id="aplicacion" value="#{piezaHome.instance.aplicacion}" >
<f:selectItems value="#{aplicacionList.resultList}"/>
<s:convertEntity />
</h:selectOneMenu>

aplicacionList.resultList nos devuelve el listado de aplicaciones disponibles, es decir un list de objetos, solo que la clase Aplicacion extiende de SelectItem y sobreescribe los siguientes metodos de estos:

@Transient
public String getLabel() {
return getName(); //To change body of overridden methods use File | Settings | File Templates.
}

@Transient
public Object getValue() {
return this; //To change body of overridden methods use File | Settings | File Templates.
}

Entonces hay que fijarse que al obtener el value lo que obtenemos es una referencia al objeto(return this), y en el jsf incorporamos la etiqueta de seam s:convertEntity para la conversión ya que de lo contrario nos genera un error de cast exception



martes, 12 de junio de 2007

configurar IntelliJ Idea con seam para TestNG

settings>proyect structure
modules>actualModule

  1. addContentroot
    • add jbossseam folder
    • mark lib as sourcefolder
  2. actual module
    • sourceFolders:
      • embedded-ejb/conf
      • resources
      • src/action
      • src/model
    • testFolders:
      • src/test

Dependencies:
  • proyectDependencies:
    • addClasses: actualModule/lib/*



References to resources outside module: relative



Si te da un error
javax.naming.NameAlreadyBoundException
puede ser que la librería jboss-seam.jar y el source seam/src/main estén arrancando el datasource dos veces!!!


mirar en ejemplos del SEAM!!!

Create the jboss-seam Eclipse project with the following directories
in your source path:

src/main/
examples/blog/src/
examples/blog/resources/
embedded-ejb/conf/

And all jar files from the following directories in your classpath:

lib/
embedded-ejb/lib

3. Run examples/blog/src/org/jboss/seam/example/blog/test/testng.xml
using the TestNG plugin.

lunes, 11 de junio de 2007

package-info jdk6 con clases compiladas con jdk5

clean all
ant run build del seam
ant run build del example

A package-info class contains annotated package and annotation type. These classes are compiled using JDK 6 compiler with target 1.5. JDK 5 fails to load the generated package-info with the following error:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6553734

viernes, 8 de junio de 2007

Idioma japones arreglado

he colocado esto en la cabecera de las páginas correspondientes:
<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>

y en la definicion de los campos de la base de datos:
column charset: utf8
column collate:utf8_bin


EN LOCAL FUNCIONA ok
TENGO QUE IMPORTAR INFO A LOCAL Y EXPORTAR TODO ESQUEMA A SERVER

jueves, 7 de junio de 2007

Tail for Win32

un programa para windows que hace como el tail -f de linux

miércoles, 6 de junio de 2007

deleted object would be re-saved by cascadE

La excepción que lanza es la siguiente:
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [es.cafs.model.RecursoProfesorImpl#33]

y ocurría la segunda vez que intentaba borrar un item(RecursoProfesorImagen) de un Set de un Objeto(Profesor), y además el scope era de Conversation, así que el error era que había que refrescar la entidad principal una vez que se volvia a seleccionar la entidad hija.

lunes, 4 de junio de 2007

Obvio en action script

El archivo y el nombre de clase que la contiene debe coincidir el nombre
Clase Cuadrado debe existir en el path correspondiente pero siempre en un archivo llamado Cuadrado.as

viernes, 1 de junio de 2007

Cambiar el log en jboss console

Hay que editar {JBOSS_HOME}/server/default/conf/log4j.xml
Este es el appender por defecto:

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="INFO"/>
<param name="Target" value="System.out"/>

<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n"/>
</layout>
</appender>

Y habría que cambiar la class de appender por:org.apache.log4j.ConsoleAppender poner el nivel del log a debug para que veamos todos los debug excepto los que no queramos que lo especificamos incluyendo las siguientes categorías

<category name="org.jboss">
<priority value="INFO"/>
</category>

<category name="org.hibernate">
<priority value="WARN"/>
</category>

<category name="javax">
<priority value="WARN"/>
</category>

sábado, 26 de mayo de 2007

DisclosureEvent event

DisclosureEvent event tiene un metodo para saber si se ha cerrado o abierto el componente CoreShowDetailItem, así recibiremos muchos eventos aunque la accion haya sido solamente expandir uno solo de ellos.

miércoles, 23 de mayo de 2007

af:validateDateTimeRange problem

El error del del validador de date TimeRange se debe a que debemos resetear el Time del Calendar correspondiente, más o menos así:


public void resetTime(Calendar f ){

f.set(Calendar.HOUR_OF_DAY, 0);
f.set(Calendar.MINUTE, 0);
f.set(Calendar.SECOND, 0);
f.set(Calendar.MILLISECOND, 0);


}


<af:validateDateTimeRange maximum="#{convCursosListado.seleccionClaseActual.finFiltro.time}"

minimum="#{convCursosListado.seleccionClaseActual.inicioLimite.time}"/>

lunes, 21 de mayo de 2007

Seam contexto evento en componente produce errores en adf:Switcher

Falla el af:switcher.setFacetName(String name) cuando el componente que lo activa pierde el render.

lunes, 14 de mayo de 2007

decimales en java

public static float roundNum(float num) throws Exception
{
float valor = 0;

valor = num;

valor = valor*100;
valor = java.lang.Math.round(valor);
valor = valor/100;

return valor;

}

si quieres que se trunque a 1 decimal multiplicas por 10 y divides para 10
si quieres que se trunque a 2 decimales multiplicas por 100 y divides para 100
y asi según el número de decimales que necesites.

el método round(valor) de la clase java.lang.Math también puede recibir valores doubles en su argumento

jueves, 3 de mayo de 2007

Cambiar usuario y grupo

drwxr-xr-x 2 root mysql 4096 2007-05-03 19:02 qx014
empezando que root es el propietario y mysql el grupo
chgrp -R mysql /var/lib/mysql/qx014 --> esto cambiaría el grupo a mysql

chown nuevo-usuario archivo

Espacio libre

free y vmstat
du -s directorio para conocer el espacio libre

Control de recursos, ps

  1. Usuarios conectados
  2. programas en ejecución
  3. estado de la memoria, fisica y virtual
  4. espacio libre de los discos
  5. información relacionada con las sesiones de trabajo
los estados a distinguir en un proceso son:
  • run : ejecución
  • sleep: bloqueado o dormido a la espera de algún servicio
  • ready: listo
  • stopped: detenido
  • zoombie: ha terminado pero se encuentra a la espera de un evento

El comando who permite conocer los usuarios conectados en un momento dado.
el comando finger permite conocer los usuarios conectados desde maquinas remotas


Para visualizar procesos:
ps
ps auxw | more
( [a] otros usuarios, [u]información asociada a los recursos, [x] para ver los demonios, [w] ver nombre completo del programa)

Las abreviaturas del estado son:
  • R: (runnning -ready)
  • S e I: (sleeping /iddle)
  • T (stopped)
  • Z (zoombie)
  • H (halt)
  • P (page wait)
  • D (disk wait)
El comando top permite visualizar los procesos en una ventana
Y luego hay uno muy util: pstree que muestra las relaciones entre procesos, hay que combinarlo con more: pstree | more.
a

alias command

los alias permiten asociar un comando con parametros a un nombre que hace de comando. Ej:
alias ll="ls -l"
entonces cuando ejecutemos ll entonces hará listado con detalles

los alias así definidos pertenecen al contexto, para incluirlos en el inicio habría que incluirlos en el .bashrc

instalar jdk linux

http://javabasico.osmosislatina.com/java_linux.htm

miércoles, 2 de mayo de 2007

inittab iniciar servicios en arranque

http://www.hispafuentes.com/hf-doc/man/man5/inittab.5.html

reboot reinicio

/sbin/reboot

o

/sbin/shutdown -r now

tail -f para mostrar log de forma continuada

tail -f archivoLOG
-n para indicar numero de lineas

martes, 1 de mayo de 2007

Patrones en linux para buscar

http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular
http://www.ss64.com/osx/grep_pattern.html

Problema con characterSet

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ page contentType="text/html;charset=windows-1250" %>

Bueno, estas líneas las quité y funcionó, es decir que la "ñ" quedaba grabada en la base de datos de esa forma y antes aparecía un punto más o menos así --> ~

lunes, 30 de abril de 2007

Acceder a componentes de Seam desde JSP JSF

Component o = (Component) Contexts.getApplicationContext().get("convProfesores.component");
Profesores profesores = (Profesores) o.getInstance("convProfesores");

y para enviar variables aprovechando el conexto de seam (aunque se podría hacer a través del request):

Contexts.getApplicationContext().set("nombreDeVariable", objeto a enviar);

EntidadConRecursos entidadConRecursos = (EntidadConRecursos) Contexts.getApplicationContext().get(nombreDeVariable);

sábado, 28 de abril de 2007

Convert Date to Calendar

Calendar calendar = Calendar.getInstance();
calendar.setTime(i.getFechaInicio());

@RequestParameter en Seam

@RequestParameter
String idCurso;

viernes, 27 de abril de 2007

NonUniqueObjectException - Illegal attempt to associate a collection with two open sessions

El problema estaba relacionado con los tipos de contexto de Seam e hibernate
Estaba cargando en session unas listas de datos y en contexto (Render phase) de evento hibernate daba error

invertir java.util.List

List invertir=new ArrayList();
for(int index=lista.size()-1; index>=0; index--)
invertir.add(parents.get(index));
return invertir;

jueves, 26 de abril de 2007

obtener el valor del request en jstl/jsf

#{param.nombreDeVariable}

info obtenida en
http://www.exampledepot.com/egs/javax.servlet.jsp.jstl.core/getparam.html?l=rel

JSF ADF RENDER DISPLAY PROBLEM

Si se utiliza más de un formulario en la página el explorer casca en el visualizado

Componentes JSF/ADF y renderizado

<af:panelBorder id="panelBorder"></af:panelBorder>

<af:panelBox id="panelBox"></af:panelBox>

el panelBorder genera un div
y el panelBox un table

miércoles, 25 de abril de 2007

PermGen space Jboss OutOfMemoryError:

hay que incrementar la memoria reservada para el permgen dela siguiente forma en el run .bat del jboss
set JAVA_OPTS=%JAVA_OPTS% -Xms512m -Xmx1000m -XX:MaxPermSize=128m

Expression Language EL con conditional

<af:goLink styleClass="#{(appADFServicio.actualPage=='/home.jsp')?'menuPrincipalLinkON':'menuPrincipalLink'}" text="#{messages.home}" destination="home.jsf"/>

Funciones en EL:
incluir la etiqueta: xmlns:fn="http://java.sun.com/jsp/jstl/functions"
y acceder a través del prefijo fn, ejemplo fn:substring

http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html
http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

Problemas con el character set en java

Actualizar driver y que no haya duplicados de librería
actualmente estoy usando mysql-connector-java-5.0.5-bin.jar

Internacionalización en mysql

SHOW VARIABLES LIKE 'character_set_system';

martes, 24 de abril de 2007

Ejecutar archivos jar desde la linea de comandos

java -cp . -jar archivo.jar

lunes, 23 de abril de 2007

error hibernate.hbm2ddl.auto mysql restrictions

Si al utilizar la herramienta de hibernate: hbm2ddl Si tienes un error parecido a éste:
Caused by: java.sql.BatchUpdateException: null, message from server: "Cannot add or update a child row: a foreign key constraint fails (`pruebasevilla/traducciones`, CONSTRAINT `FK6CE29E6294037F2F` FOREIGN KEY (`entidadTraduccion`) REFERENCES `profesores` (`id`))"

Tienes mysql configurado con restricciones, para arreglarlo sigue estos pasos (hay que reconfigurar mysql):

  1. inicia mysql Server Instance Configuration Wizard
  2. Selecciona: reconfigure Instance
  3. Selecciona: detailed Configuration
  4. Selecciona lo que tu veas yo marqué Developer Machine
  5. Selecciona:Non-Transactional Database Only
  6. Selecciona lo que tu veas yo marqué Decision Support(DSS)/OLAP
  7. Selecciona: Enable TCP/IP Networking
  8. Selecciona: Enable Strict Mode
  9. ...

jboss seam no escanea componentes / scanning problem seam

si no existe el seam.properties no funciona, aunque sea un archivo en blanco debe existir en el source path

crear un nuevo usuario en mysql

GRANT ALL PRIVILEGES
ON *.* TO 'root'@'localhost' IDENTIFIED BY '' WITH
GRANT OPTION;

jueves, 19 de abril de 2007

Problema actualizando la base de datos con dbunit : dbunit Cannot delete or update a parent row:

Bueno pues para que funcione DBUNIt en una base de datos con restricciones de indices, es decir foreigns keys, pues antes de actualizar los datos habría que deshabilitar dichas restricciones de la siguiente forma:
SET FOREIGN_KEY_CHECKS=0, AUTOCOMMIT=0 ===========> DESHABILITAR
SET FOREIGN_KEY_CHECKS=1, AUTOCOMMIT=1 ===========> HABILITAR

SessionFactory ds = (SessionFactory)ctx.lookup(getDataSourceJNDIName());
Connection conexionPrincipal = ds.openSession().connection();

conexionPrincipal.createStatement().execute("SET FOREIGN_KEY_CHECKS=0, AUTOCOMMIT=0");
/**
aquí se harían las operaciones de actualizar la base de datos
**/

conexionPrincipal.createStatement().execute("SET FOREIGN_KEY_CHECKS=1, AUTOCOMMIT=1");

información encontrada en:
http://forum.springframework.org/archive/index.php/t-21957.html

windows xp home edition sp2 sobre macos problema restart reboot problem

http://www.apple.com/support/downloads/imacefifirmwareupdate11.html

miércoles, 18 de abril de 2007

Cambiar la memoria del JVM

http://weblogs.java.net/blog/aiqa/archive/2005/04/jvm_memory_usag.html
Aquí he encontrado la solución pero sencillamente hay que cambiar estos parametros:
set JAVA_OPTS=%JAVA_OPTS% -Xms300m -Xmx800m

lunes, 16 de abril de 2007

af:chooseDate


Para conseguir un calendario como éste ( ADF ) con el componente af:chooseDate habría que insertar el siguiente código en la página jsp. Siendo el maxValue y el minValue los limites del calendario, es decir los días en los que se puede hacer click




<af:chooseDate binding="#{Bean.chooseDate1}" id="chooseDate1"

maxValue="#{Bean.maximo}"

minValue="#{Bean.minimo}"/>


y quedando la clase java de la siguiente manera:


import oracle.adf.view.faces.component.core.input.CoreChooseDate;

public class Bean {


private CoreChooseDate chooseDate1;

public CoreChooseDate getChooseDate1() {
return chooseDate1;
}

public void setChooseDate1(CoreChooseDate chooseDate1) {
this.chooseDate1 = chooseDate1;
}

public Date getMaximo(){
Calendar hoy=Calendar.getInstance();
hoy.roll(Calendar.DAY_OF_YEAR,10);
return hoy.getTime();

}

public Date getMinimo(){
Calendar hoy=Calendar.getInstance();
hoy.roll(Calendar.DAY_OF_YEAR,-10);
return hoy.getTime();

}

}

viernes, 13 de abril de 2007

Anotaciones y anotaciones de persistencia



Anotaciones de persistencia:
annotations.hibernate.org/
www.hibernate.org/hib_docs/annotations/reference/en/html_single/

Los EJB3 se caracterizan por ser POJOs, es decir Plain Old Java Object, y esto quiere decir que no tienen nada de especial, son solo clases con propiedades y sus respectivos metodos accesores (get/set).

Las anotaciones (persistencia) se agrupan en dos categorías: mapeo lógico(relaciones y modelado de objeto) y mapeo físico(esquema de la base de datos)

Las clases para ello se encuentran en: javax.persistence.*


Hay que tener en cuenta que todos los campos o metodos no declarados como estaticos o transient se consideran persistentes. Así que habría que anotar todas las propiedades que no queramos persistir con: @Transient. Y la etiqueta minima de persistencia sería la de @Basic la cual puede ir complementada por el tipo de carga que queremos, ejemplo @Basic(fetch= FetchType.LAZY), esto tiene sus restricciones así que hay que mirar el tutorial y enterarse bien.


Framework para javaScript

Me han recomendado este:
www.mochikit.com

extensiones para firefox

Las extensiones simplemente extienden la funcionalidad básica del programa. En este caso dan más funcionalidad al navegador firefox.
Para utilizar el disco de gmail como disco duro Gspace
Para comparar la visualizacion en el explorer: IE Tab
Para el desarrollo web CSS existe una muy util : Firebug
FTP ...
Las extensiones se ordenan en categorias:

Examinar extensiones por categoría

Posicionamiento de divs

http://alistapart.com/articles/holygrail

configurar JAVA_HOME en eclipse y ant

Cuando recibimos el mensaje: Perhaps JAVA_HOME does not point to the JDK, que en mi caso me salió al intentar lanzar unas pruebas desde ANT tenemos que seguir las siguientes instrucciones :


-----------------------------------------------

Of course, JAVA_HOME is pointing to the right location, in both the OS environment and within Eclipse (This variable can be set within Eclipse through Window > Preferences > Java > Classpath Variables).

So how to fix the Ant build problem?

Go to Window > Preferences > Ant > Runtime. Choose the Classpath tab. Select the Global Properties node in the tree and click Add External JARs. Select tools.jar from your JDK directory (e.g., j2sdk1.4.2_03\lib\tools.jar).
------------------------------------------------

miércoles, 11 de abril de 2007

¿qué es un Aspecto en una instancia de clase u objeto?

¿qué es un aspecto en la programación orientada a aspectos POA?

Un aspecto es una serie de operaciones que se repiten y pueden afectar a diferentes objetos y operaciones diferentes.
Un caso común es la métrica o testeo de la aplicación en tiempo. Si tenemos que incluir el código relacionado con medir el tiempo que tarda un método en ejecutarse dentro del propio método, entonces estamos mezclando aspectos diferentes e independientes del programa, tales como la ejecucion de una suma y el tiempo que tarda el producirse.



**** en desarrollo pero se refiere al aspecto en su forma más abstracta o dicho de otra forma el aspecto como perteneciente a un proceso

  1. El aspecto se puede referir al estado temporal (entendido como fase temporal o estado) del ciclo de vida de un objeto.
  2. También se puede entender como un comportamiento (interfaz) de la clase o instancia.

Los aspectos se implementan en forma de interceptores.
Un interceptor es un proxy.
En un programa orientado a aspectos debe existir un objeto que se encarga de devolver las nuevas instancias de las clases implicadas en la ejecución del programa. Este objeto encargado de la creación de nuevos objetos (el típico SpringFrameWork o Jboss Seam) devuelve proxys que tiene el mismo comportamiento que la clase esperada pero además aporta más comportamientos a la clase.


Ideas a desarrollar:
Entender la programación como un algoritmo de ciclos temporales/vitales de la instancia de un objeto.

Hibernate y ¿Para qué y cuando usar: equals y hashCode?


Según el tutorial de hibernate-3, esto se hace para utilizar las colecciones de tipo java.util.Set se implementaría así:


Teniendo en cuenta que se hace por el tema de indexación en un java.util.Set

public class Cat {
...
public boolean equals(Object other) {
if (this == other) return true;
if ( !(other instanceof Cat) ) return false;
final Cat cat = (Cat) other;
if ( !cat.getLitterId().equals( getLitterId() ) ) return false;
if ( !cat.getMother().equals( getMother() ) ) return false;
return true;
}
public int hashCode() {
int result;
result = getMother().hashCode();
result = 29 * result + getLitterId();
return result;
}
}

***HAY QUE ACCEDER A LAS PROPIEDADES A TRAVÉS DE SUS ACESORES PORQUE ES DE ESA FORMA QUE HIBERNATE CARGA LAS PROPIEDADES

Could not find selected item matching value af:selectOneChoice f:selectItems

Este problema se da cuando en un selecItems no encuentra en la lista de posibles valores el valor seleccionado (selected) aunque veamos que de hecho si existe.

ADF/JSF al intentar seleccionar el valor de la lista de posibles valores lo hace a través del metodo equals() que tenemos que sobreescribir para que compare las claves de negocio y no compare por serialización del objeto (en este caso nunca serian iguales dos instancias con iguales valores de una clase).

Y el problema se produce cuando el acceso a los valores lo hacemos sin el correspondiente metodo interceptado por hibernate (PORQUE SI UTILIZAMOS HIBERNATE ESTAMOS UTILIZANDO POA [programación orientada a aspectos y por lo tanto interceptores] )
por un problema en la implementacion del equals e Hibernate.

La razón de este error es la siguiente:

Al acceder a las propiedades de los objetos sin el metodo adecuado (interceptado por hibernate) es decir los getter, el valor que devuelve es el que tiene por defecto la clase o el que tenga la instancia del objeto en un momento dado del programa.

miércoles, 4 de abril de 2007

CURRICULUM VITAE




domingo, 1 de abril de 2007

Variables de entorno

set [sin argumentos] ---> visualizar todas las variables

Ejemplos para incluir variable:

  • JAVA_HOME="${JAVA_HOME}:/usr/javatools/jdk1.5.0/:"
  • PATH="${PATH}:/home/my_user/bin:"

export variable=valor
---> incluir variable con valor en el proceso actual

echo $nombre_variable --> visualiza valor de variable


*Nota:
(Dos puntos sin incluir después un directorio son tratados como
el directorio de trabajo actual)

Definir variables de entorno en macosx

Habría que editar el siguiente archivo
~/.MacOSX/environment.plist

siendo ~/ el directorio del usuario a modificar


En caso de no existir dicho archivo hay que crearlo a mano y también colocarle las directivas xml correspondientes

Y podemos utilizar la herramienta:
/Developer/Applications/PropertyListEditor.app

Hay que reiniciar la sesión de usuario para que surja efecto.






Ejemplo:




viernes, 30 de marzo de 2007

Configurar permisos para cuenta ftp

Hay que tener en cuenta que el usuario y el grupo de la carpeta destinada a ftp (y que tiene que ser la misma que la existente en el archivo de configuración) debe tener los correspondientes permisos de escritura/lectura/ejecucion

chmod 741 html/ftp/ quedando de la siguiente forma
drwxr----x 2 usuario grupo 4096 Mar 30 22:20 ftp

chgrp chown

wikipedia chgrp
chgrp -R nuevogrp directorio
wikipedia chown
chown -R nuevousr directorio

Control de usuarios y contabilidad de recursos

Fichero /etc/passwd
En cada linea puedes encontrar todos estos parametros (JOÉ):

  • nombre de cuenta
  • contraseña cifrada,
  • identificador numerico
  • identificador de grupo
  • informacion convencional
  • directorio raiz de la cuenta
  • interprete de comandos asignado
¿Cómo crear y modificar cuentas?
http://www.linux-party.com/TutorialLinux/linux_files/linux5.html


Configurar Servidor FTP

Cómo configurar tu servidor FTP desde línea de comandos en un sistema operativo Linux.


Para que nuestro Linux tenga la posibilidad de que se le conecten por FTP para realizar transferencia de ficheros, necesita tener instalado y configurado un servidor de FTP. En este artículo vamos a ver el modo de configurar un servidor de FTP por línea de comandos. No pasaremos a describir lo que es un servidor de FTP ya que en el tutorial de FTP ya lo explicamos.



Configuración

Una vez instalados comenzaremos a configurarlo a nuestro gusto. Comenzaremos con la lista de usuarios que podrán tener acceso al servidor FTP:

Para configurar este parámetro necesitaremos abrir el archivo /etc/ftpusers que se encuentra en /etc/. En este archivo pondremos ver una lista con los usuarios que tienen acceso.

Pero en realidad el archivo más importante para la configuración del servidor es el /etc/proftpd.conf que contiene todos los parámetros de configuración, entre otras cosas la ubicación de los archivos compartidos. Dentro de este archivo se encuentran los siguientes parámetros, que podemos modificar dependiendo del uso que le queramos dar.

anonymous.allow

Con este parámetros se habilita o deshabilita el usuario anónimo.
Anonymous.allow=trae (usuario anónimo habilitado)
Anonymous.allow=false (usuario anónimo deshabilitado)

Write_enable

Indica si una carpeta tiene permiso de escritura o no. En otras palabras indica si a una carpeta se la pueden subir archivos o no.
Write_enable=trae (si tiene permiso de escritura)
Write_enable=false (no tiene permiso de escritura)

ftpd_banner

Permite poner un mensaje de bienvenida a los usuarios cuando se conecten
ftpd_banner=mensaje

chroot_local_user

Permite o no a los usuarios locales el acceso a la maquina
chroot_local_user=trae
chroot_local_user=false

Para decirle al servidor fe FTP que usuarios tienen permiso para acceder tenemos que coger la ruta de el archivo antes comentado donde se encontraba la lista de usuarios (vsftpd.user_list)
Para ello en el archivo de configuración pondríamos algo como esto:
Chroot_list_file=/etc/vsftpd.user_list

Básicamente con estos comandos podrás configurar tu servidor FTP en Linux sin ningún problema.

Arrancar y detener el servidor de FTP

Ya solo nos queda arrancar el servidor para lo cual utilizaremos los siguientes comandos.

Para arrancar el servicio: /etc/init.d/proftpd Start

Para parar el servicio: /etc/init.d/proftpd stop

Para reiniciar el servicio: /etc/init.d/proftpd restart

Conclusión

Este artículo esta escrito haciendo referencia a Linux red hat 9.0 pero las configuraciones y los comandos son mas o menos los mismo en las distintas distribuciones.

En qué consiste llevar un buen mantenimiento de un servidor en linux

Aquí un listado de las características que debería tener el mantenimiento de un servidor linux:

  1. Copias de seguridad incrementales
  2. Replicación de información
  3. Incluir los demonios en el arranque del servidor
  4. Procesos periodicos (crontab)
  5. crear una imagen inicial con los programas necesarios
  6. control de usuarios y contabilidad de recursos
  7. controlar spam - /var/mail

¿qué más se os ocurre ?

Codificacion de fichero de internacionalizacion.properties

Después de mucho cavilar, es decir de averigüar si podía ser el problema de jboss, de mi MACOSX, del JVM, o del editor de java (eclipse o intellij idea), probé a guardar nuevamente el archivo .properties con la codificación final dentro del paquete .war y funcionó. El "culpable" era ANT, y concretamente su tarea copy que había que indicarle la codificación a seguir.

Solucion: columnas dinamicas en un af:iterator

La solución, aparente chapuza pero es que con c:if no funcionaba, consiste en utilizar el iterator varias veces (esto serían las celdas de la tabla ) y renderizar la fila en función de #{vs.index mod 3==[numero de fila del 0 al 2]}


<h:panelGrid columns="4">
<af:outputText value="#{messages.clases}"/>

<af:iterator value="#{curso.clasesList}" var="clase" first="0" varStatus="vs">
<afh:rowLayout rendered="#{vs.index mod 3==0}">
<af:outputText value="#{clase.nombre}" escape="false"/>
</afh:rowLayout>
</af:iterator>
<af:iterator value="#{curso.clasesList}" var="clase" first="1" varStatus="vs">
<afh:rowLayout rendered="#{vs.index mod 3==1}">
<af:outputText value="#{clase.nombre}" escape="false"/>
</afh:rowLayout>
</af:iterator>

<af:iterator value="#{curso.clasesList}" var="clase" first="2" varStatus="vs">
<afh:rowLayout rendered="#{vs.index mod 3==2}">
<af:outputText value="#{clase.nombre}" escape="false"/>
</afh:rowLayout>
</af:iterator>
</h:panelGrid >

mysql character set --> JAPones

links interesantes:
http://www.javaworld.com/javaworld/jw-09-2004/jw-0906-unicode.html?page=2
http://www.java2s.com/Code/Java/Development-Class/StringConverterUnicode.htm
http://forums.mysql.com/read.php?103,144564,146204#msg-146204
http://galaxy.andromda.org/forum/viewtopic.php?t=4386&view=next&sid=43ab0c5645142a2b937d8e5fb1040cbe
http://www.oop-reserch.com/mysql.html

probar con charset:big5
collation:big5_bin

jueves, 29 de marzo de 2007

Comandos útiles para saber el juego de caracteres en tus bases de datos de mysql

(Character Sets and Collations in MySQL)

mysql> SHOW CHARACTER SET;
mysql> SHOW FULL COLUMNS FROM test;
mysql> ALTER TABLE test CHARACTER SET latin1;

Permisos en linux - chmod

Algunos ejemplos de utilización

para ejecutables
unos permisos adecuados serían:
rwxr-x--x lo que indica todos los permisos para propietario y ejecución para el resto

al utilizar el comando chmod se puede hacer de forma relativa o absoluta.
Al hacerlo de forma relativa lo que se hace es modificar los permisos existentes con expresiones del tipo:

  • o-w # esto sería quitar el permiso de escritura al propietario
  • g+w # esto daria permiso de escritura a grupo
De forma absoluta:
** si se quiere hacer a un directorio y a todos los que cuelgan de él hay que utilizar chmod -R XXX dir


· chmod 600 directorio asigna permisos de lectura y escritura al propietario
· chmod 444 directorio asigna permisos de lectura o todos
· chmod 777 directorio todos los permisos a todos


r w xr w xr w x
Permisos Actuales 4+2+1 4+0+1 0+0+0

7 5 0

r w x r w x r w x
Cambiar a: 4+2+1 4+0+1 4+0+1

7 5 5


Por último aquí esta una tabla que permite saber rápidamente que valor asignar como permiso a cualquiera de los tres modos.

Val.Permisos
0---
1--x
2-w-
3-wx
4r--
5r-x
6rw-
7rwx



Permisos en directorios:
el derecho de ejecucion [x] en los directorios indica derecho de paso por el directorio a los ficheros o directorios contenidos en él. El derecho de lectura [r] da derecho a conocer su contennido. Puede ser útil el no dar derecho de lectura y si de ejecución, de esa forma permitiremos el paso por el directorio restringiendo el conocimiento de su contenido.
El permiso de escritura [w] indica si se puede crear/modificar/eliminar su contenido

Bits especiales:
Los últimos 3 bits relacionados con los permisos.
setuid- hace un set de id de usuario
setgid - hace un set de id de grupo
sticky - fija ej programa permanentemente en la memoria (esto es una propiedad de los virus quedarse como residentes en la memoria)

Guía para Crear Archetypes

Creando archetypes podemos definir nuestra aplicación mínima. Es decir , una aplicación que contendrá los recursos mínimos que sabemos utilizaremos. Se podría definir como automatizar nuestros propios frameworks.

http://maven.apache.org/plugins/maven-archetype-plugin/examples/archetype.html


me acaban de dejar este link que podemos ir mirando y que tiene buena pinta:
http://www.chuidiang.com/chuwiki/index.php?title=Categor%C3%ADa:Maven

miércoles, 28 de marzo de 2007

apt-get

...apt?.

APT son las siglas de Advanced Package Tool. APT es un sistema de gestión de paquetes de software desarrollado por el APT Team del Proyecto Debian bajo licencia GNU/GPL.

Es el sistema de gestión de paquetes más avanzado en la actualidad y el que má flexibilidad y potencia posee para entornos de red.

... apt-get?.

``apt-get'' es la utilidad para usar desde la línea de órdenes que hace de interfaz entre el usuario y APT.



http://www.linuca.org/body.phtml?nIdNoticia=39

Comprimir/descomprimir

* Ficheros tar
Empaquetar: tar -cvf archivo.tar /dir/a/comprimir/
Desempaquetar: tar -xvf archivo.tar
Ver contenido tar -tf archivo.tar

* Ficheros gz
Comprimir: gzip -9 fichero
Descomprimir: gzip -d fichero.gz

* Ficheros bz2
Comprimir: bzip fichero
Descomprimir: bzip2 -d fichero.bz2

gzip ó bzip2 sólo comprimen ficheros [no directorios, para eso existe tar]. Para comprimir y archivar al mismo tiempo hay que combinar el tar y el gzip o el bzip2 de la siguiente manera:

* Ficheros tar.gz
Comprimir: tar -czfv archivo.tar.gz ficheros
Descomprimir: tar -xzvf archivo.tar.gz
Ver contenido: tar -tzf archivo.tar.gz

* Ficheros tar.bz2
Comprimir: tar -c ficheros | bzip2 > archivo.tar.bz2
Descomprimir: bzip2 -dc archivo.tar.bz2 | tar -xv
Ver contenido: bzip2 -dc archivo.tar.bz2 | tar -t

* Ficheros zip
Comprimir: zip archivo.zip ficheros
Descomprimir: unzip archivo.zip
Ver contenido: unzip -v archivo.zip

* Ficheros lha
Comprimir: lha -a archivo.lha ficheros
Descomprimir: lha -x archivo.lha
Ver contenido: lha -v archivo.lha
Ver contenido: lha -l archivo.lha

* Ficheros arj
Comprimir: arj a archivo.arj ficheros
Descomprimir: unarj archivo.arj
Descomprimir: arj -x archivo.arj
Ver contenido: arj -v archivo.arj
Ver contenido: arj -l archivo.arj

* Ficheros zoo
Comprimir: zoo a archivo.zoo ficheros
Descomprimir: zoo -x archivo.zoo
Ver contenido: zoo -L archivo.zoo
Ver contenido: zoo -v archivo.zoo

* Ficheros rar
Comprimir: rar -a archivo.rar ficheros
Descomprimir: rar -x archivo.rar
Ver contenido: rar -l archivo.rar
Ver contenido: rar -v archivo.rar

Descargar archivos desde el web a traves de la consola

  wget -c ftp.juan.es/pub/programas/netscape.rpm
wget -r ftp.juan.es/pub/fotos/paisajes
wget -rL www.8052.com
El primer ejemplo se bajaría el fichero netscape.rpm directamente al directorio actual, pudiendo cortarlo en cualquier momento con CTRL+C para continuar su download otro dia desde el punto en que se quedó (como reget, NetVampire, etc) utilizando el mismo comando. El segundo ejemplo se bajaría todos los ficheros que hubieran en el directorio pub/fotos/paisajes del ftp especificado, y el tercero se bajaría la web www.8052.com completa (incluyendo fotos, subdirectorios, etc) para poder navegar por ella en el disco duro offline.

Reiniciar Mysql

Para reiniciar MySql
/etc/init.d/mysql stop
/etc/init.d/mysql start

Archivo de configuración de mysql en /etc/mysql/my.cnf

Despues en /etc/mysql/my.cf comentar skip-network y reiniciar el mysql

Re: Como reisntalo mysql?

La cosa mejor es salvar los datos primero
cp -R /var/lib/mysql /home/back-up
cp /etc/mysql/my.cnf /home/back-up

despues borras realmente todo con:
apt-get remove --purge mysql*

que te borra todas estas cosas
mysql
mysql-base
mysql-client
mysql-client-4.1
mysql-common
mysql-common-4.1
mysql-dev
mysql-devel
mysql-doc
mysql-doc-4.1
mysql-gpl-client
mysql-server
mysql-server-4.1

despues hace un apt-get clean que borra la cache de apt
y por ultimo instalas todo de nuevo
;-)

ojo --purge borra absolutamente todo!

martes, 27 de marzo de 2007

Buscando en linux

find directorio -name nombre

find /usr/ -name *svn*


find . -mtime 0   # find files modified within the past 24 hours
find . -mtime -1 # find files modified within the past 24 hours
find . -mtime 1 # find files modified between 24 and 48 hours ago
find . -mtime +1 # find files modified more than 48 hours ago
find . -mmin +5 -mmin -10 # find files modifed between 6 and 9 minutes ago

Interceptores Jboss Seam

Fases de JSF ya es mucha diferencia

Hay que crear una @interface que la utilizaremos para etiquetar/interceptar la clase(componente en terminos de Seam) correspondiente


import javax.interceptor.Interceptors;
import java.lang.annotation.Documented;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target;

/**
* Created by IntelliJ IDEA.
* User: juanitu
* Date: 12-abr-2007
* Time: 17:43:24
* To change this template use File | Settings | File Templates.
*/
@Target(TYPE)
@Retention(RUNTIME)
@Documented
@Interceptors(Interceptor.class)
public @interface EtiquetaInterceptora {

}


Despues definimos el interceptor poniendo especial interes en como tratamos el tema de las fases de la aplicacion:



import org.jboss.seam.annotations.Around;
import org.jboss.seam.annotations.Within;
import org.jboss.seam.interceptors.*;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.contexts.Lifecycle;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import javax.faces.event.PhaseId;

import es.cafs.dao.CafsDAO;
import es.cafs.metadata.componentes.Componentes;

import java.lang.reflect.Method;

/**
* Created by IntelliJ IDEA.
* User: juanitu
* Date: 12-abr-2007
* Time: 17:45:36
* To change this template use File | Settings | File Templates.
*/
@Around({BijectionInterceptor.class, ValidationInterceptor.class,
ConversationInterceptor.class, BusinessProcessInterceptor.class})
@Within(RemoveInterceptor.class)
public class Interceptor {

protected static Log log = LogFactory.getLog(org.jboss.seam.interceptors.Interceptor.class);

@AroundInvoke
public Object checkLoggedIn(InvocationContext invocation) throws Exception {

CafsDAO dao = (CafsDAO) Contexts.getApplicationContext().get(Componentes.appCafsDAO);
log.error(dao==null);

Method method = invocation.getMethod();
log.error(invocation.getTarget().getClass()+"-"+method.getName() + " " + method.getReturnType());
if (Lifecycle.getPhaseId() == PhaseId.INVOKE_APPLICATION) {
log.error("INVOCANDO FASE");
} else {
log.error(invocation.getTarget().getClass()+"-"+method.getName() + " " + method.getReturnType());
log.error("OTRA FASE");

}

return invocation.proceed();
}
}





Y por último hay que etiquetar el componente correspondiente


@Scope(ScopeType.CONVERSATION)
@Name(Componentes.convVisorInformacion)
@Logeando
public class VisorInformacion{
}

Introducción a Maven

Maven es una herramienta escrita en Java para facilitar el trabajo de programación en java, concretamente se utiliza para la compilación y mantenimiento de cualquier proyecto basado en Java.

  • Permitir la compilación del código fuente y su empaquetamiento de forma fácil, es decir: te puedes olvidar de las dependencias de segundos y terceros
  • Estandarizar el directorio donde se incluyen los diferentes recursos
  • Proporcionar información eficiente o útil sobre el proyecto
  • Enfoque a patrones de diseño o desarrollo
  • Permitir la migración a nuevas versiones de las herramientas a utilizar
Sus plugins se pueden encontrar en: http://maven.apache.org/plugins/index.html

No te olvides de:
export PATH=/usr/local/maven-2.0.5/bin:$PATH


Creating a webapp

Use maven-archetype-webapp to start a simple webapp maven project. The command is as follows

mvn archetype:create
-DgroupId=[your project's group id]
-DartifactId=[your project's artifact id]
-DarchetypeArtifactId=maven-archetype-webapp


POM
: "Project Object Model".
Documento XML que representa el proyecto:
  • archivos de configuración
  • programadores implicados y sus roles
  • empresa y licencias
  • URL del proyecto
  • dependencias
En un proyecto con Maven el pom.xml, es lo único imprescindible.

The Basics



4.0.0
org.codehaus.mojo
my-project
1.0

groupId: Id de organizacion o empresa, suele ser su paquete java
ej: com.mediaymedia
artifactId: El nombre del proyecto: wiki
version:
packaging:


http://maven.apache.org/pom.html#Introduction

Interface e implementación: causas y efectos

diferencias y consecuencias del diseño con interfaces.
Diseño robusto frente a diseño frágil
Contrato de interface


La interfaz

PD: diseño orientado a pruebas con Mocks

lunes, 26 de marzo de 2007

IceFaces

vamos a seguir:
http://www.icefaces.org/docs/v1_5_1/htmlguide/devguide/DevelopersGuideTOC.html

Programación en Java ¿y qué más?

¿y que más? Pues nuestro interés se dirigirá a programar orientándonos a objetos,aspectos y pruebas.
Utilizaremos las siguientes herramientas: TestNG, DBUnit, Hibernate, JSF, JBoss Seam ...

http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n
http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Java
http://es.wikipedia.org/wiki/Orientado_a_objetos
http://es.wikipedia.org/wiki/Programaci%C3%B3n_Extrema
http://es.wikipedia.org/wiki/J2EE
Se pondrá un especial interés en recopilar los errores que vayan apareciendo