Download Informe de actividad

Document related concepts
no text concepts found
Transcript
Informe de actividad
David A. Velasco Villanueva
sprint # 22
16/07/2010 – 07/09/2010 (extendido tras 22/07/2010)
Objetivos planteados y alcanzados
•
[000033] Hacer los adaptadores de implementación portables / configurables
[DONE]
•
[000051] Estudiar LAMS
[DONE]
•
[000035] Documentación de diseño interno de GLUEletManager
[ WIP ]
•
Modificar la configuración de MoodleAdaptor a un solo parámetro 'URL base'
[DONE]
Por partes
Modificar la configuración de MoodleAdaptor a un solo parámetro 'URL base'
** Modificar la configuración de MoodleAdaptor a un sólo parametro
En un sólo parámetro "URL base" se agrupa nombre de servidor o IP, puerto y, opcionalmente, un
trozo de ruta que irá prefijado a 'GLUEletManager'.
** Componer la URL en las llamadas a GLUEletManager a partir del parámetro URL base
Modificar en lib.php las funciones gluelet_get_configuration(...), gluelet_get_instance(...) y
gluelet_delete_remote_instance(...) para que compongan la URL de llamada a partir del valor
guardado en $CFG->{GLUELET_MOD . '_base_url'} (valor configurado en la consola de
administración).
Modificar el resultado entregado por las funciones gluelet_get_tools_list() y
gluelet_post_new_instance(...) para que en la base de datos no se guarden las URLs completas, sino
sólo la parte final posterior a la cadena 'http://' . $CFG->{GLUELET_MOD . '_base_url'} .
'/GLUEletManager'.
[000033] Hacer los adaptadores de implementación portables / configurables
Similar a lo hecho con GLUEletManager:
•
fichero app.properties con propiedades configurables
•
dos propiedades:
◦ port: número de puerto de atención de peticiones
◦ logging: on/off, para activar/desactivar el sistema de logging
Cambios en código afectan únicamente al fichero [Whatever]AdaptorServerMain, inicialización del
adaptador.
[000051] Estudiar LAMS
** Carga de la lista de herramientas 'GLUEficadas' a partir de resultado de GET TOOLS
Nos quedamos en:
2010-07-15 18:19:16,244 ERROR [org.apache.catalina.core.ContainerBase.
[jboss.web].[localhost].[/lams/tool/gsglue10].[action]] Servlet.service() for
servlet action threw exception
java.lang.StackOverflowError
at java.lang.String.indexOf(String.java:1521)
at java.net.URLStreamHandler.parseURL(URLStreamHandler.java:127)
at
org.jboss.net.protocol.file.Handler.parseURL(Handler.java:35)
at java.net.URL.<init>(URL.java:596)
at java.net.URL.<init>(URL.java:464)
at sun.misc.URLClassPath$FileLoader.getResource(URLClassPath.java:976)
at sun.misc.URLClassPath$FileLoader.findResource(URLClassPath.java:966)
at sun.misc.URLClassPath$1.next(URLClassPath.java:196)
at sun.misc.URLClassPath$1.hasMoreElements(URLClassPath.java:206)
at java.net.URLClassLoader$3$1.run(URLClassLoader.java:416)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader$3.next(URLClassLoader.java:413)
at java.net.URLClassLoader$3.hasMoreElements(URLClassLoader.java:438)
at
org.jboss.mx.loading.UnifiedLoaderRepository3.getResources(UnifiedLoaderReposito
ry3.java:332)
at
org.jboss.mx.loading.RepositoryClassLoader.findResources(RepositoryClassLoader.j
ava:543)
at java.lang.ClassLoader.getResources(ClassLoader.java:1041)
at java.lang.ClassLoader.getResources(ClassLoader.java:1037)
at
org.restlet.engine.util.EngineClassLoader.getResources(EngineClassLoader.java:15
1)
at org.restlet.engine.Engine.registerHelpers(Engine.java:724)
at org.restlet.engine.Engine.discoverConnectors(Engine.java:475)
at org.restlet.engine.Engine.<init>(Engine.java:325)
at org.restlet.engine.Engine.register(Engine.java:246)
at org.restlet.engine.Engine.register(Engine.java:235)
at org.restlet.engine.Engine.getInstance(Engine.java:148)
at org.restlet.engine.Engine.getLogger(Engine.java:203)
at org.restlet.Context.getCurrentLogger(Context.java:87)
at org.restlet.engine.Engine.registerHelper(Engine.java:659)
at org.restlet.engine.Engine.registerHelpers(Engine.java:688)
at org.restlet.engine.Engine.registerHelpers(Engine.java:730)
(se repiten las 10 últimas hasta la saciedad)
Pensando que podría ser un problema por la carga dinámica de objetos.
Pero no. El problema es que el servidor de aplicaciones no incluye las bibliotecas RESTlet en el
CLASSPATH de la aplicación web. Para solucionarlo, además de copiar los JAR correspondientes
en el directorio lams.ear del servidor desplegado, hay que hay que añadir sus nombres en el fichero
lams.ear/META-INF/application.xml, en el que se indica que JARs deben cargarse en el contexto
del EAR.
La entrada en el fichero, con todos los JAR necesarios, es:
<!-- GLUElet dependencies , by davivel -->
<module>
<java>glue-common.jar</java>
</module>
<module>
<java>org.restlet.ext.atom.jar</java>
</module>
<module>
<java>org.restlet.ext.xml.jar</java>
</module>
<module>
<java>org.restlet.jar</java>
</module>
<!-- End of GLUElet dependencies , by davivel -->
Todo esto lo he hecho a mano. Habrá que plantearse cómo modificar el fichero build.xml para
hacer el despliegue de la forma más simple e independiente posible.
Esto soluciona el problema de carga, aunque en el momento de completar la interacción se produce
un último error. La comunicación con GLUEletManager se establece correctamente, PERO al
intentar acceder al contenido de los <atom:entry> de respuesta se obtiene una excepción por un
valor NULL.
Afortunadamente no es un problema en la llamada GET, sino en la biblioteca GLUECommon en la
que basamos la extracción de datos de las herramientas formateadas. Tras hacer un poco de
fontanería en la misma, se soluciona completando adecuadamente el método
FormattedFeed.getEntries() y añadiendo un constructor más a FormattedEntry, con parámetro único
de tipo (DOM) Node.
Ojo; que la carga del conector cliente RESTlet haya sido posible no quiere decir ni que haya sido
eficiente (creo un Component RESTlet antes de cada llamada, dudo mucho que sea necesario...), ni
que respete la seguridad del contenedor de servlets (aunque en este punto, el hecho de que el
contenedor no intente impedir la conexión puede ser una buena señal). Habrá que comprobar ambas
cosas en el futuro.
Pero ahora toca hacer un poco de roadmap para LAMSAdaptor.
** Roadmap de tareas siguientes
Llamadas GLUE por implementar:
•
(1) Lanzar GET CONFIGURATION al seleccionar la herramienta (¿hay que añadir botón?)
•
(4b) POST INSTANCE
•
(6) GET INSTANCE
•
(7) DELETE INSTANCE - ¿cuándo?
Modificaciones en la interfaz de usuario:
•
(1) Extender IU con un bloque cuando se seleccione la herramienta GLUE en la lista
•
(2) Incluir el formulario XForms en el bloque anterior
•
(3) Recoger la respuesta XML del formulario XForms en LAMSAdaptor (puede que
construir el documento XML)
•
(6) Modificar las vistas de monitorización / uso para poder visualizar la instancia GLUElet
Integración con interacciones en LAMSAdaptor:
•
(4a) Guardar la configuración XForms en la base de datos; implica modificar el modelo de
datos persistentes
•
(4b) Buscar el punto (en código) más adecuado para lanzar POST INSTANCE
◦ implica analizar cómo funciona la característica 'postergar configuración hasta
monitorización'
•
(5) Comprobar las operaciones hechas automáticamente por LAMS cuando se asigna una
secuencia de aprendizaje que incluye un GLUElet a un curso LAMS
•
(8) Encajar el uso de grupos
Limpieza (después):
•
eliminar 'restos' de lams-forum
•
revisar eficiencia de llamadas
•
refactorizar
•
generar mecanismo de despliegue fácil
Planificación: agrupar todas las anteriores en actividades racionalmente, de acuerdo con lo que se
puede probar y lo que no; ¿estimación de tiempo? (puf – this will be hard)
#### AHORA ####
Detalle de modificaciones:
•
Vista:
◦ web\jsps\authoring\basic.jsp
▪ (lo que haya, que algo es)
◦ conf\language\lams\ApplicationResources_en_AU.properties
ApplicationResources.properties
y
▪ (lo que haya, que algo es)
•
Modelo – AÑADIR ATRIBUTO toolConfigurationForm a Gluelet, que implica:
◦ src\...\persistence\Gluelet.java
▪ añado atributo String toolConfigurationForm, para guardar el formulario
▪ añado getToolConfigurationForm y setToolConfigurationForm para atributo
toolConfigurationForm
▪ getToolConfigurationForm
incluye
column="toolConfigurationForm"
XDoclet
@hibernate.property
▪ añado toolConfigurationForm a la implementación de los métodos equals() y
hashCode()
◦ db\sql\create_lams_tool_gluelet.sql
▪ añado columna "toolConfigurationForm text" al final de tl_gsglue10_gluelet
◦ db\sql\table-schema.sql
▪ añado "toolConfigurationForm text" al final de creación de tl_gsglue10_gluelet
◦ db\sql\insert_lams_tool_gluelet_data.sql
▪ añado valor "TEST TOOLCONFIGURATIONFORM" como valor por defecto de
columna toolConfigurationForm.
◦ src\java\...\service\GlueletService (y IGlueletService)
▪ añado método 'public String getToolConfigurationForm(String glueToolId);'
•
Controlador (ver cambios, que los hay)
◦ NO TOCAR DIRECTAMENTE STRUTS-CONFIG.xml ; es un fichero generado; tocar
en su lugar conf/xdoclet/struts-action.xml
▪ añado acción getToolConfigurationForm
◦ src\java\...\web\actions\AuthoringAction
▪ añado método getToolConfigurationForm(...), que hace:
•
(ver código)
Otras cosas no planeadas
** Comprobar la solución del RESTlet issue 1306
He recibido una notificación del equipo de RESTlet pidiéndome que pruebe el problema con la
excepción en ClientResource.get(), ya que según ellos debería estar solucionado.
He probado con RC4 y el problema original está corregido:
•
Las pruebas con el código Proxy / Server que envié para que probaran el error ponen de
manifiesto que el error persiste en las versiones 2m07, 2RC1 y 2RC2; y está corregido en
2RC4 (no he probado RC3).
•
Las pruebas con GLUEletManager confirman la corrección con 2RC4.
Cabe destacar que, al tirar el adaptador de implementación para provocar la excepción en
GLUEletManager y enviar como respuesta desde éste el código HTTP generado por la propia
excepción, éste resulta ser un código 1001, que no es estándar. Cosas de RESTlet...
Cambios derivados:
•
eliminación del 'apaño' en las llamadas a recursos remotos desde GLUEletManager, en:
◦ ConfigurationResource.getRemoteResource(...)
◦ InstanceResource.getRemoteResource(...)
◦ InstanceResource.deleteRemoteResource(...)
◦ InstanceFactoryResource.postRemoteCreation(...)
◦ GLUEletManagerServerMain.resetClientConnector() (eliminado)
•
deben actualizarse los JAR de RESTlet a instalar con GLUEletManager al paquete de la
versión 2.0 RC4, disponible en http://www.restlet.org/downloads/2.0/restlet-jse-2.0rc4.zip ;
no es necesario actualizar los JARs de los adaptadores de implementación.
## Y además ##
•
Gestiones habituales
Futuro
### OLD ###
GO ON, LAMSAdaptor:
•
1. Conseguir una herramienta 'tonta' que no produzca errores.
(DONE)
•
2. Modificar la interfaz de autoría para incluir una lista de selección hardcoded para las
herramientas.
(DONE)
•
3. Modificar la configuración de la lista de selección para que se cargue a partir la
respuesta de GET TOOLs
(WIP)
Paralelamente, hay que avanzar de verdad con:
•
Completar [000035]: documentación de diseño interno de GLUEletManager; y otras
actividades de documentación
•
[000033] Hacer [Implementation]Adaptor portables