Al momento de configurar Thymeleaf, trate de forzar con LinkedHashSet que el set siempre estuviera ordenado. Aunque Thymeleaf lo hace internamente me imagino, para no perder el orden de los template resolvers, solo queria asegurarme que desde un principio estuvieran ordenados y mantuvieran el orden.
<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
<property name="templateResolvers">
<set value-type="java.util.LinkedHashSet">
<ref bean="emailTemplateResolver"/>
<ref bean="webTemplateResolver"/>
</set>
</property>
<property name="additionalDialects">
<set>
<bean class="org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect" />
<bean class="org.thymeleaf.extras.conditionalcomments.dialect.ConditionalCommentsDialect" />
<bean class="nz.net.ultraq.thymeleaf.LayoutDialect" />
</set>
</property>
</bean>
Al final siempre obtenia la misma excepcion. Leyendo el codigo de Thymeleaf en la clase ServletContextResourceResolver se dispara la excepcion cuando el contexto que se recibe como parametro no es una instancia de IWebContext.
Pero en TemplateRepository existe un ciclo que itera los template resolvers definidos en el xml de configuracion e inyectados por spring, los cuales vienen en un Set, en un LinkedHashSet, pero en mis pruebas siempre viene ServletContextResourceResolver (webTemplateResolver) primero y después ClassLoaderTemplateResolver (emailTemplateResolver) por alguna razon no se iteran en orden.
La solucion que encontre mas sencilla es: en lugar de lanzar la expecion, regresar null, de esta manera el ciclo en TemplateRepository seguira buscando algun template resolver que pueda manejar la plantilla que se le envia, y por lo tanto le da oportunidad de que ClassLoaderTemplateResolver pueda encontrar la plantilla, y la encuentra.
public InputStream getResourceAsStream(final TemplateProcessingParameters templateProcessingParameters, final String resourceName) {
Validate.notNull(templateProcessingParameters, "Template Processing Parameters cannot be null");
Validate.notNull(resourceName, "Resource name cannot be null");
final IContext context = templateProcessingParameters.getContext();
if (!(context instanceof IWebContext)) {
if (logger.isWarnEnabled()) {
logger.warn(
"Resource resolution by ServletContext with {} " +
"can only be performed " +
"when context implements {} " +
" [current context: {} ]", new Object[] { this.getClass().getName(),
IWebContext.class.getName(), context.getClass().getName() });
}
return null;
}
final ServletContext servletContext =
((IWebContext)context).getServletContext();
if (servletContext == null) {
throw new TemplateProcessingException("Thymeleaf context returned a null ServletContext");
}
return servletContext.getResourceAsStream(resourceName);
}
El jar de la version 2.0.15 que es la version que estoy usando.
Programacion
martes, 11 de febrero de 2014
jueves, 6 de febrero de 2014
Holder.js fluid image
La libreria holder.js que Bootstrap ya incluye por default, nos permite generar placeholders mediante javascript. Cuando la imagen que queremos generar es "fluid", holder.js pone las dimensiones de la imagen por default como texto.
Para cambiar este comportamiento y hacer que holder.js genere la imagen con nuestro texto, una forma es:
function render(mode, el, holder, src) {
...
holder.theme.text = holder.text; //Esto hara que la imagen se genere con nuestro texto.
el.holderData = holder;
fluid_images.push(el);
fluid_update(el);
...
<img data-src='holder.js/100%x100/#fff:#000/text:Hola'/>
Para cambiar este comportamiento y hacer que holder.js genere la imagen con nuestro texto, una forma es:
function render(mode, el, holder, src) {
...
holder.theme.text = holder.text; //Esto hara que la imagen se genere con nuestro texto.
el.holderData = holder;
fluid_images.push(el);
fluid_update(el);
...
<img data-src='holder.js/100%x100/#fff:#000/text:Hola'/>
miércoles, 6 de junio de 2012
Obtener columnas pertenecientes a un constraint
select a.*, c.part1, c.part2, c.part3 from syscolumns a, sysconstraints b, sysindexes c
where a.tabid = b.tabid and b.tabid = c.tabid and b.idxname = c.idxname
and b.constrname like 'pk_tblsolicitud_prod_detalle1'
martes, 31 de enero de 2012
Informix - Funciones de fecha
Las funciones de fecha de Informix acpetan argumentos DATE o DATETIME, o
una representacion en caracteres de un valor DATE o DATETIME. Tipicamente
devuelven valores DATE o DATETIME, o convierten los valores DATE o DATETIME
a cadenas de caracteres.
ADD_MONTHS
SELECT ADD_MONTHS(DATE('1986/08/24'), 2) FROM (SELECT LIMIT 1 1 FROM systables)
SELECT ADD_MONTHS(DATE('1986/08/24'), -2) FROM (SELECT LIMIT 1 1 FROM systables)
DATE
La funcion DATE convierte su argumento a un valor DATE. El argumento puede
ser cualquier expresion que pueda ser convertida a DATE, usualmente CHAR,
DATETIME, o INTEGER.
SELECT DATE('1986/08/24') FROM (SELECT LIMIT 1 1 FROM systables)
SELECT DATE(-1) FROM (SELECT LIMIT 1 1 FROM systables)
DAY, MONTH, YEAR
Recibe un argumento DATE o DATETIME y devuelve el dia del mes como un entero en
el rango de 1 al maximo numero de dias del mes en cuestion. Lo mismo aplica para
MONTH y YEAR respectivamente.
SELECT DAY(DATE('1986/08/24')) FROM (SELECT LIMIT 1 1 FROM systables)
SELECT MONTH(DATE('1986/08/24')) FROM (SELECT LIMIT 1 1 FROM systables)
SELECT YEAR(DATE('1986/08/24')) FROM (SELECT LIMIT 1 1 FROM systables)
WEEKDAY
Recibe un argumento DATE o DATETIME y devuelve un entero en el rango del 0 al 6
que representan el dia de la semana. Cero representa al Domingo, uno al lunes, etc.
SELECT WEEKDAY(DATE('1986/08/24')) FROM (SELECT LIMIT 1 1 FROM systables)
MONTHS_BETWEEN
SELECT MONTHS_BETWEEN(DATE('1987/08/24'), DATE('1986/08/24')) FROM (SELECT LIMIT 1 1 FROM systables)
LAST_DAY
Requiere una expresion DATE o DATETIME como argumento. Esta devuelve el ultimo
dia del mes que el argumento especifica.
SELECT DAY(LAST_DAY(DATE('1987/08/24'))) FROM (SELECT LIMIT 1 1 FROM systables)
NEXT_DAY
Requiere una expresion DATE o DATETIME como primer argumento, y requiere un segundo
argumento weekday que es una cadena en mayusculas representando la abreviatura de el
nombre en Ingles para un dia de la semana. Devuelve
SELECT NEXT_DAY(DATE('1986/08/24'), 'SAT') FROM (SELECT LIMIT 1 1 FROM systables)
MDY
SELECT MDY(1, 24, 1986) FROM (SELECT LIMIT 1 1 FROM systables)
TO_CHAR
Convierte una expresion que evalua DATE o DATETIME o un valor numerico a una
cadena de caracteres.
SELECT TO_CHAR(DATE('1986/08/24'), '%Y-%m-%d') FROM (SELECT LIMIT 1 1 FROM systables)
TO_DATE
Convierte una cadena de caracteres a un valor DATETIME.
SELECT TO_DATE('1986/08/24', '%Y/%m/%d') FROM (SELECT LIMIT 1 1 FROM systables)
Comparacion entre fechas
SELECT DATE('1986/08/24') > DATE('1984/08/24') FROM (SELECT LIMIT 1 1 FROM systables)
Ejecutando Store Procedures en aplicaciones JDBC
Para este ejemplo se necesitan dos elementos, un store procedure de prueba y una clase
de java que ejecute el store procedure.
El store procedure recibe dos parametros de entrada y un parametro de salida, los parametros
de salida se declaran como si fueran parametros de entrada pero con la palabra reservada
OUT (un parametro tambien puede ser de entrada y salida INOUT).
La clase de java ejecuta el store procedure, primero obtiene un objeto ResultSet que es
el resultado de la sentencia RETURN de nuestro store procedure. Posteriormente obtiene
el objeto del parametro de salida OUT.
Store Procedure
CREATE PROCEDURE storeProcedurePrueba ( int_uno INT, int_dos VARCHAR, OUT resultado INT)
RETURNING INTEGER;
BEGIN
LET resultado = int_uno * int_dos;
RETURN resultado;
END
END PROCEDURE
DROP PROCEDURE storeProcedurePrueba
Clase Java
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
public class InformixStoreProcedure {
public static void main(String[] args) {
Connection conn = null;
String url = "jdbc:informix-sqli://192.168.0.120:1526/bd:informixserver=server";
String driver = "com.informix.jdbc.IfxDriver";
String user = "informix";
String pass = "informix";
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, pass);
System.out.println("Conectado a la base de datos !!!");
//Notar que son tres parametros
String sqlCall = "{call storeProcedurePrueba(?, ?, ?)}";
CallableStatement sp = conn.prepareCall(sqlCall);
sp.setInt(1, 5);
sp.setString(2, "4");
sp.registerOutParameter(3, Types.INTEGER);
ResultSet rs = sp.executeQuery();
while (rs.next()) {
System.out.println(rs.getObject(1));
}
Integer resultado = sp.getInt(3);
System.out.println("Resultado de la ejecucion: " + resultado);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Referencias
http://publib.boulder.ibm.com/infocenter/idshelp/v111/index.jsp?topic=/com.ibm.jdbc_pg.doc/jdbc031409727.htm
http://publib.boulder.ibm.com/infocenter/idshelp/v111/index.jsp?topic=/com.ibm.jccids.doc/com.ibm.db2.luw.apdv.java.doc/doc/tjvcscsp.htm
viernes, 23 de septiembre de 2011
Instalando httpd en Centos 6
Descargando servidor httpd
$ cd software
$ wget http://apache.webxcreen.org//httpd/httpd-2.2.21.tar.bz2
Extrayendo las fuentes
$ cd ../httpd-installation/source
$ tar xvf ../../software/httpd-2.2.21.tar.bz2
$ cd httpd-2.2.21
Instalanado Software necesario
Compilador, Archivos de desarrollo de openssl, y vim
$ su -c 'yum install gcc'
$ su -c 'yum install openssl-devel'
$ su -c 'yum install vim'
Compilando
$ ./configure --prefix=/home/pgsadmin/httpd-installation/installation --enable-proxy --enable-ssl
$ make && make install
Configurando servidor httpd
$ vim conf/httpd.conf
Definiendo el puerto en el cual el servidor web escuchara peticiones
Listen 8080
Iniciando el servidor
$ bin/apachectl start
Comprobando que el servidor esta corriendo en el puerto que se especifico
$ netstat -ntl
Si el puerto 8080 esta escuchando probamos acceder desde un navegador web
$ links http://10.17.221.47:8080
It Works
Abriendo puertos en el firewall iptables
$ iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
$ iptables -F
$ cd software
$ wget http://apache.webxcreen.org//httpd/httpd-2.2.21.tar.bz2
Extrayendo las fuentes
$ cd ../httpd-installation/source
$ tar xvf ../../software/httpd-2.2.21.tar.bz2
$ cd httpd-2.2.21
Instalanado Software necesario
Compilador, Archivos de desarrollo de openssl, y vim
$ su -c 'yum install gcc'
$ su -c 'yum install openssl-devel'
$ su -c 'yum install vim'
Compilando
$ ./configure --prefix=/home/pgsadmin/httpd-installation/installation --enable-proxy --enable-ssl
$ make && make install
Configurando servidor httpd
$ vim conf/httpd.conf
Definiendo el puerto en el cual el servidor web escuchara peticiones
Listen 8080
Iniciando el servidor
$ bin/apachectl start
Comprobando que el servidor esta corriendo en el puerto que se especifico
$ netstat -ntl
Si el puerto 8080 esta escuchando probamos acceder desde un navegador web
$ links http://10.17.221.47:8080
It Works
Abriendo puertos en el firewall iptables
$ iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
$ iptables -F
lunes, 15 de agosto de 2011
Instalando WebLogic en un servidor de 64 bits remoto
Una de las caracteristicas de X Window System es que esta implementado con una
arquitectura cliente/servidor, lo que permite mostrar ventanas de una maquina
(cliente) a otra maquina (servidor).
Descargando WebLogic 64 bits
$ wget http://url.donde.esta.weblogic/wls1035_generic.jar
Si no comienza la descarga siempre se puede descargar mediante el navegador.
Enviando el archivo descargado a la maquina destino
$ scp wls1035_generic.jar diego@192.168.1.64:/home/diego/weblogic
Ejecutando en la maquina local (servidor) una aplicacion de la maquina destino
(cliente)
$ ssh -X diego@192.168.1.64
password:
$ java -jar weblogic/wls1035_generic.jar
Ejecutamos el instalador y las ventanas que deberian abrirse en la maquina
destino (cliente) se abren en la maquina local (servidor).
arquitectura cliente/servidor, lo que permite mostrar ventanas de una maquina
(cliente) a otra maquina (servidor).
Descargando WebLogic 64 bits
$ wget http://url.donde.esta.weblogic/wls1035_generic.jar
Si no comienza la descarga siempre se puede descargar mediante el navegador.
Enviando el archivo descargado a la maquina destino
$ scp wls1035_generic.jar diego@192.168.1.64:/home/diego/weblogic
Ejecutando en la maquina local (servidor) una aplicacion de la maquina destino
(cliente)
$ ssh -X diego@192.168.1.64
password:
$ java -jar weblogic/wls1035_generic.jar
Ejecutamos el instalador y las ventanas que deberian abrirse en la maquina
destino (cliente) se abren en la maquina local (servidor).
Suscribirse a:
Entradas (Atom)