jueves, 26 de enero de 2012

Concatenar elementos de una colección en un String

En java, para poder concatenar los elementos de una colección en un único String haciendo uso del separador que deseemos emplearemos la liberia commons-lang de apache.

En el codigo de nuestra aplicación escribiremos:
String listaStr = StringUtils.join(lista, ",");

miércoles, 25 de enero de 2012

Iterar sobre un enumerado con JSTL

Para poder iterar sobre un enumero con JSTL primero deberemos insertar el enumerado en el contexto de la pagina:
pageContext.setAttribute("miEnum", MiEnum.values());
Seguidamente ya podremos iterar con el haciendo uso de JSTL:
<c:forEach items="${miEnum}" var="item">
   <c:out value="${miEnum.value}" />
</c:forEach>

viernes, 20 de enero de 2012

Div dentro dentro de un link

Pues eso, que hoy he descubierto que según el estándar HTML4.01 las etiquetas <a></a> solo puede contener etiquetas de visualización inline, es decir, un <div></div> no cumple esa cualidad.

lunes, 16 de enero de 2012

Como crear campo autoincremental en postgres

Para ello tenemos dos alternativas:
  • El uso de serial o bigserial como tipo de dato del campo.
  • Haciendolo a mano definiendo, un sequencial, luego el campo que queramos con las restricciones oportunas y asignando como dueño del sequencial al campo que acabamos de crear.
En el siguiente enlace viene muy bien explicado lo que os comento: http://www.postgresql.org/docs/8.4/static/datatype-numeric.html#DATATYPE-SERIAL

Usar JNDI en tests de jUnit

Para poder cargar el contexto y poder acceder a lo que configuremos con JNDI en jUnit definiremos el método setUp de la siguiente forma:
try {
    // Create initial context
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
        "org.apache.naming.java.javaURLContextFactory");
    System.setProperty(Context.URL_PKG_PREFIXES, 
        "org.apache.naming");            
    InitialContext ic = new InitialContext();

    ic.createSubcontext("java:");
    ic.createSubcontext("java:/comp");
    ic.createSubcontext("java:/comp/env");
    ic.createSubcontext("java:/comp/env/jdbc");
   
    // Construct DataSource
    OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
    ds.setURL("jdbc:oracle:thin:@host:port:db");
    ds.setUser("MY_USER_NAME");
    ds.setPassword("MY_USER_PASSWORD");
    
    ic.bind("java:/comp/env/jdbc/nameofmyjdbcresource", ds);
} catch (NamingException ex) {
    Logger.getLogger(MyDAOTest.class.getName()).log(Level.SEVERE, null, ex);
}
En la zona donde definimos el DataSource podremos incluir cualquier conexión a base de datos que necesitemos simplemente cambiando las clases. En el mi caso que es para Postgres la cosa quedaría así:
PGPoolingDataSource ds = new PGPoolingDataSource();
ds.setServerName("SERVER");
ds.setDatabaseName("DB_NAME");
La fuente de todo esto la extraje de: http://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit

viernes, 13 de enero de 2012

Convertir int a enum en Java

Hoy me he estado peleando en java buscando la forma de convertir un entero que hay almacenado en la BD a un tipo enumerado que tengo definido en mi aplicación. En los métodos de serie no viene nada así que venga buscar, y mas buscar, y he dado con dos soluciones:

Primera solución:
En el caso de que la enumeración que tenemos almacenada empiece en 0, podremos usar esto:
MyEnum foo = MyEnum.values()[valorEnteroDeLaBD];
Las pegas de este sistema es que el coste de llamar a .values() es muy alto además de que estamos obligados a empezar la enumeración en 0.

Segunda solución y la mejor para mi:
Dentro del enum declaramos un Map statico y un metodo estatico que rellene el Map. Además deberemos crear un atributo valor para poder almacenar el valor enumerado que queramos. Esto quedaria asi:
import java.util.HashMap;
import java.util.Map;

public enum EstadoIncidencia {
 ABIERTO_POR_CLIENTE(1), RESPONDIDO(2), EN_PROCESO(3), CERRADO(4);

 private int value;
 private static final Map typesByValue = new HashMap();

 static {
  for (EstadoIncidencia type : EstadoIncidencia.values()) {
   typesByValue.put(type.value, type);
  }
 }

 private EstadoIncidencia(int value) {
  this.value = value;
 }

 public int getValue() {
  return value;
 }
 
 public static EstadoIncidencia forValue(int value) {
  return typesByValue.get(value);
 }
}
Esto lo he encontrado en StackOverflow: http://stackoverflow.com/questions/5292790/convert-integer-value-to-matching-java-enum
Espero os sea igual de util que a mi ;).

miércoles, 11 de enero de 2012

Concatenar cadenas dentro de etiquetas jsp

Hoy me he encontrado con una cadena de codigo tal que asi dentro de un jsp:
<jsp:include page="<%=var + "/foo" %>" flush="true" />
Si eso lo ejecutas en un tomcat 6 o superior te dara una fallo y no compilara el jsp. La solucion que me han dado mis compañeros es la siguiente: En el arranque del tomcat añadimos el siguiente parametro:
-Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
A mi modo de ver es una solucion pero no me convence, asi que he seguido investigando y habia gente que hacia esto otro:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:include page="${var}/foo" flush="true" />
Espero os haya gustado la solucion a este problemilla que seguro le habreis dedicado unos minutillos valiosos.

Tengo que echar un ojo a esto

En el blog de GenbetaDev he leido en uno de los comentarios que había una alternativa a ajax. Parece interesante asi que cuando tenga tiempo este finde me leere el tema y lo trasteare un poquillo porque me pica la curiosidad esos de los websockets que tanto leo a menudo. http://code.google.com/p/jquery-websocket/

lunes, 9 de enero de 2012

Ostras tu lo que se encuentra uno

Hoy, Esther, una compi del curro me ha pasado el siguiente enlace y me ha parecido tan interesante que quiero compartirlo con vosotros :).

http://tympanus.net/codrops/category/tutorials/

Espero que la disfrutéis tanto como yo

lunes, 2 de enero de 2012

Métodos estáticos en javascript

Como sigo metido con OO en JavaScript, hoy me he visto en la necesidad de crear un método estático, a continuación os digo como:
function MiClase() {
  // Constructor
}

MiClase.MetodoEstatico = function () {
  // Metodo estatico, no se puede invocar con new MiClase().MetodoEstatic()
};