jueves 2 de diciembre de 2010

Migrando PostgreSQL a MySQL: MySQL Migration Toolkit

Este va a ser un pequeño tutorial de cómo migrar una base de datos de PostgreSQL a MySQL usando la herramienta gratuita MySQL Migration Toolkit.

No vamos a entrar en detalles, sólo los parámetros necesarios para que la aplicación conecte correctamente y algún punto importante a tener en cuenta.

Seguimos después del salto...

martes 2 de noviembre de 2010

Eliminando puntos de una cadena de texto (String)

Nunca me había encontrado con un problema tan aparentemente chorra, pero con una solución no tan inmediata como me esperaba.

Teníamos que eliminar los decimales de unas celdas de excel que contienen un valor del tipo: XYZ.0. Por ejemplo: 237.0; 20.0; etc. El decimal siempre era 0, y había que tratar los números como texto (nada de pasar a entero ya que en algunas celdas, los valores podían ser alfanuméricos).

La solución más inmediata es hacer esto:
cadena = "237.0";
cadena = cadena.replaceAll(".0","");
Pero esto genera problemas; si la cadena por ejemplo fuese del tipo "hola 10".
Finalmente la solución pasa por utilizar expresiones regulares. Tenéis un artículo muy bueno en castellano aquí.

La solución para nuestro caso, y para que sólo sustituya a los carácteres ".0" (puntoCero) sería:
cadena = cadena.replaceAll("[.]0", "");

miércoles 27 de octubre de 2010

Descartando clases en el debug desde Eclipse

Me acaba de ocurrir que haciendo debug de una aplicación  hecha con Struts 2, entraba en clases que para mí eran irrelevantes: DefaultActionInvocation, clases de librerías de Apache, etc.

Hacer debug no es muy divertido cuando estamos ante un proyecto que no conocemos bien, la aplicación pega mil y un saltos entre clases y si además, se mete donde no debe, puede resultar un tanto desquiciante.

Eclipse nos facilita un poco la vida, permitíendonos seleccionar las clases y/o paquetes por los cuales no deseamos que el debug se detenga; algo así como una lista negra.

Simplemente entramos en Windows => Preferences => Java => Debug => Step Filtering

Se nos abrirá una ventana donde podremos agregar todos los paquetes y las clases donde nuestro debug no se debe detener: sencillo y eficaz.


jueves 22 de julio de 2010

Mostrando las calificaciones de usuarios de BlackBoard LS

Una breve descripción de lo que es Blackboard Learning System (a partir de ahora BB o BBLS) por cortesía de Wikipedia.

Blackboard Learning System, un entorno de manejo de cursos. Actualmente esta plataforma está siendo usada a nivel mundial por diversas instituciones relacionadas con la educación, tal es el caso del Servicio Nacional de Aprendizaje SENA en Colombia. También la utilizan la Universidad Nacional de Colombia, la Universidad de los andes y la Pontificia Universidad Javeriana. En México tiene presencia desde hace más de 10 años en diversas universidades e instituciones como el Instituto Tecnológico y de Estudios Superiores de Monterrey (ITESM).


Hemos estado desarrollando un conector que nos sirva para comunicarnos más facilmente con Blackboard y así realizar operaciones del tipo: editar un usuario, inscribir un usuario en un curso, borrar un usuario, etc.

Casi todas estas operaciones se realizan a través de conexiones HTTP y el envío de ficheros xml con la información.

Uno de los puntos más interesantes ha sido la utilización de la API de BB para obtener datos. Para ello, la API se conecta con el WebService correspondiente y así podemos utilizar todas las operaciones que se nos permite.

Aquí el código más interesante:


ContextSDK ctxt = new ContextSDK(new URL(serviceUrlContext));
SessionVO session = ctxt.login("user", "pass", lcid);
GradeBookService gradeBook = new GradeBookSDK(new URL(serviceUrlGradeBook));


El usuario debe de ser un usuario de BBLS con permisos de instructor sobre el curso sobre el que queremos consultar las calificaciones.

Obtenemos el SectionID de la Sección o Curso (sectionId y sectionSource son el source.id y el source.data respectivamente)

long sectionLongId = ctxt.getLearningContextIdBySourcedId("sectionId"," sectionSource");


Obtenemos el columnID de la columna del GradeBook por ejemplo, el ID de la columna "Final"

SectionColumnVO columnsVO[] = gradeBook.getSectionColumns(session, sectionLongId, 2);
for(int i = 0; i < columnsVO . length; i++){
if (columnsVO[i].getLabel().equalsIgnoreCase("Final")){
columnsLongId = columnsVO[i].getId();

}
}



Obtención del memberID a partir del UserId de blackboard:

long memberIds[] = gradeBook.getSectionStudentIDs(session, sectionLongId);
SubjectVO[] members = gradeBook.getMemberDescriptions(session ,memberIds);
for (int i=0; i < members . length; i++){
if (members[i] . getWebctID() . equalsIgnoreCase("NombreDeUsuario")){
memberId = memberIds[i];
}
}



Finalmente, obtenemos las calificaciones

ColumnValue cValues[] = gradeBook.getMemberGradeValues(session, sectionLongId, memberId, columnLongId);

for(int i = 0; i < cValues.length; i++) { if(cValues[i] != null) { System.out.println("La calificación "+columns+" de "+username+" es "+cValues[i].getValue()); } }



Disculpad si se me escapa algo, el código fuente ha sido adaptado de una función que recibía una lista de columnas y una lista de miembros matriculados en un curso.

viernes 5 de febrero de 2010

Conectar a un WebService desde Java con proxy

El otro día nos encontramos con un problema en un proyecto que tiraba de un Web Service. Nuestro entorno de desarollo se conectaba a internet a través de un proxy, y por lo tanto no lograbamos realizar la conexión correctamente.

La solución es bien sencilla:


Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",PROXY_IP);
systemProperties.setProperty("http.proxyPort",PROXY_PORT);


De esta forma nos aseguramos que la conexión se realizará a través del proxy que le indiquemos. Sencillo y eficaz.

domingo 18 de octubre de 2009

JMesa y Struts 2

Hola a tod@s,

hoy voy a dejar aquí un pequeño tutorial, paso a paso, de cómo hacer funcionar JMesa en Struts 2 (extendible a cualquier otro framework).

1º Descargamos las librerías y recursos de JMesa.

2º JMesa hace uso de JQuery, con lo cual también necesitaremos bajarnos el JS de su página web.

3º Dentro de nuestro directorio de recursos JS copiamos las librerías: "jmesa.js", "jquery-1.3.2.js", "jquery.jmesa.js".

4º Igualmente copiamos las imágenes que se adjuntan en el zip de JMESA y los 2 CSS para los estilos.

5º Añadimos los JAR a nuestra biblioteca de librerías del proyecto.

6º Copiamos el fichero jmesa.tld en /Webcontent/WEB-INF/tld/jmesa.tld y añadimos la siguiente información en nuestro web.xml

7º En /Webcontent/WEB-INF/ crearemos el fichero "jmesa.properties" donde podemos configurar diversos aspectos de JMesa como el número de resultados por página, etc.
Ejemplo:
html.toolbar.maxRowsDroplist.increments=12,24,36
limit.rowSelect.maxRows=12

8º Por último sólo debemos hacer uso de las bondades de JMesa, para ello tenéis un sencillo ejemplo aquí.

A tener en cuenta:

- El orden de importación de los js es importante. Seguid el orden del ejemplo.
- Para indicarle a JMesa los distintos atributos de nuestros objetos que queremos listar simplemente tenemos que indicarlo con el mismo nombre en htmlColumn property="atributo".

- Los atributos de los beans deben de tener sus respectivos getter().
- Importante incluir la función "onInvokeAction(id)" como se ve en el ejemplo.

Resultado:



EDIT:
Adjunto aquí los 2 archivos anteriores por si no os funciona el servidor de www.box.net.

viernes 21 de agosto de 2009

Modificar campos de un XMLCONTENT en OpenCms

Puede pasarnos, que necesitemos modificar de buenas a primera el contenido de varios XMLCONTENT en OpenCms. Si los contenidos son pocos no hay problema de hacerlo a mano; pero si son cientos o miles de recursos a modificar entonces sería conveniente que tiraramos de alguna función que nos ayude en la tarea.

Os adjunto el código que hice hace unos días para dicha tarea (cualquier sugerencia es bien recibida):
<%@ page contentType="text/html"%>
<%@ page
pageEncoding="UTF-8"%>

<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>
<%@ page import="org.opencms.jsp.*" %>
<%@ page import="org.opencms.file.*" %>
<%@ page import="org.opencms.file.types.*" %>
<%@ page import="java.util.*" %>
<%@ page import="org.opencms.xml.
content.*" %>
<%@ page import="org.opencms.xml.*, org.opencms.xml.types.*" %>

<%@ taglib prefix="cms" uri="http://www.opencms.org/taglib/cms" %>


<%

CmsJspActionElement cms = new CmsJspActionElement( pageContext, request, response );
CmsJspXmlContentBean cjxc = new CmsJspXmlContentBean(
pageContext, request, response);
CmsObject cmsObject = cms.getCmsObject();

CmsProject offlineProject = cmsObject.readProject("Offline");
CmsResource recurso = null;
CmsFile templateFile = null;
CmsXmlContent template = null;
Locale lcl = java.util.Locale.ENGLISH;

//En este caso vamos a modificar 2 campos del XMLCONTENT

I_CmsXmlContentValue contentValueCuerpo;
I_CmsXmlContentValue contentValueDescripcion;

//Ruta donde se encuentran los XMLCONTENT a modificar

String rutaCarpetas = "/noticias/";

try {
List lista = new ArrayList();
I_CmsXmlContentContainer icms = cjxc.contentload("
allInSubTreeDateReleasedDesc", rutaCarpetas + "|noticias", false);
Iterator it = icms.getCollectorResult().
iterator();


while (it.hasNext()) {

recurso = (CmsResource) it.next();
templateFile = new CmsFile(recurso);
out.println("R: "+recurso.getRootPath().
replace(cms.getRequestContext().getSiteRoot(),"") +"
");
cmsObject.lockResource(
recurso.getRootPath().replace(cms.getRequestContext().getSiteRoot(),""));
templateFile = cmsObject.readFile(recurso.
getRootPath().replace(cms.getRequestContext().getSiteRoot(),""));
template = CmsXmlContentFactory.
unmarshal(cmsObject, templateFile);



String aux_cuerpo = "";
String aux_descripcion = "";

//Función template.getValue("Campo_del_XSD",Locale)
contentValueCuerpo = template.getValue("Cuerpo", lcl);
aux_cuerpo = contentValueCuerpo.
getPlainText(cmsObject);
aux_cuerpo = aux_cuerpo.replace("smaller","
");
contentValueCuerpo.
setStringValue(cmsObject,aux_cuerpo);

contentValueDescripcion = template.getValue("
Descripcion", lcl);
aux_descripcion = contentValueDescripcion.
getPlainText(cmsObject);
aux_descripcion = aux_descripcion.replace("
smaller","");
contentValueDescripcion.
setStringValue(cmsObject,aux_descripcion);

templateFile.setContents(
template.marshal());
cmsObject.writeFile( templateFile);


out.println("Recurso: "+recurso.getRootPath().
replace(cms.getRequestContext().getSiteRoot(),"")+ "actualizado
");

}

}catch (Exception e){

}

%>