Manual de integración
Integración de INGRID con otros sistemas
INGRID es un OLM (Open Learner Model) abierto que permite su integración con distintos sistemas e-learning que manejen modelos de usuario.
Para usar INGRID es necesario proporcionarle un modelo de usuario, junto a otras opciones de configuración, a través de un servicio web, alojado actualmente en http://ingrid.iaia.lcc.uma.es/ingridExternal?wsdl. Este servicio web nos proporciona una única operación, connect, que nos devolverá una URL desde la que se podrá acceder temporalmente a la representación gráfica de dicho modelo:
String connect(String model, String ontology, String actions, String configuration)
Descripción de parámetros
model
Cadena en formato XML con el modelo que se va a representar. Relacionará un concepto con su distribución y sus notas, e incluirá el modelo temporal y la comparativa con el grupo.
El XML Schema que debe cumplir dicho XML puede ser consultado aquí
Ejemplo:
<Model> <Scores date="10-10-2011"> <Concept id="1" score="5"> <Evidence date="09-10-2011" name="Test Siette" score="5"> </Evidence> <Evidence date "05-10-2011" name="Examen" score="4"> </Evidence> <Distribution> <Elem data ="-3" prob="0"></Elem> <Elem data ="-2" prob="10"></Elem> <Elem data ="-1" prob="15"></Elem> <Elem data ="0" prob="15"></Elem> <Elem data ="1" prob="30"></Elem> <Elem data ="2" prob="20"></Elem> <Elem data ="3" prob="10"></Elem> </Distribution> <Comparative> <Elem data ="-3" prob="0"></Elem> <Elem data ="-2" prob="10"></Elem> <Elem data ="-1" prob="15"></Elem> <Elem data ="0" prob="15"></Elem> <Elem data ="1" prob="20"></Elem> <Elem data ="2" prob="30"></Elem> <Elem data ="3" prob="10"></Elem> </Comparative> <TempModel> <Milestone date="20-01-2011" score="3"> <Distribution> ... </Distribution> </Milestone> <Milestone date="20-02-2011" score="5"> <Distribution> ... </Distribution> </Milestone> </TempModel> </Concept> <Concept id="2" score="6"> ... </Concept> </Scores> </Model>
ontology
URL (apuntando a una ontología OWL) o cadena en formato XML con la ontología que se va a representar.
El XML Schema que debe cumplir dicho XML puede ser consultado aquí.
Ejemplo:
<Ontology>
<Concept id="1" name="Programación C"></Concept>
<Concept id="2" name="Bucles"></Concept>
...
<Relationship idC1="2" type="part_of" idC2="1">
</Relationship>
</Ontology>
Si lo prefiere, se puede usar una URL a una ontología especificada en formato OWL. Dicha ontología debe tener el siguiente formato:
<rdf:RDF xmlns="http://example.com/samuel/SAMUEL.owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#"> <owl:Class rdf:about="http://example.com/SAMUEL.owl#Concept"> <rdfs:label>Concept</rdfs:label> </owl:Class> <Concept rdf:about="#ID1"> <rdfs:label>IHD_01 - Instalaciones y equipos del HOGAR DIGITAL</rdfs:label> <vcard:SORT-STRING>1</vcard:SORT-STRING> </Concept> <Concept rdf:about="#ID2"> <rdfs:label>Conexión a servicios externos de comunicación en el hogar digital</rdfs:label> <vcard:SORT-STRING>1</vcard:SORT-STRING> <dcterms:isPartOf rdf:resource="#ID1"/> <rdf:type rdf:resource="http://example.com/SAMUEL.owl#Concept"/> </Concept> <Concept rdf:about="#ID6"> <rdfs:label>Infraestructuras comunes de telecomunicaciones ICT</rdfs:label> <vcard:SORT-STRING>1</vcard:SORT-STRING> <dcterms:isPartOf rdf:resource="#ID2"/> <rdf:type rdf:resource="http://example.com/SAMUEL.owl#Concept"/> </Concept> <Concept rdf:about="#ID7"> <rdfs:label>Instalaciones de fibra óptica</rdfs:label> <vcard:SORT-STRING>2</vcard:SORT-STRING> <dcterms:isPartOf rdf:resource="#ID2"/> <rdf:type rdf:resource="http://example.com/SAMUEL.owl#Concept"/> </Concept> <Concept rdf:about="#ID3"> <rdfs:label>Red de comunicación en el hogar digital</rdfs:label> <vcard:SORT-STRING>2</vcard:SORT-STRING> <dcterms:isPartOf rdf:resource="#ID1"/> <rdf:type rdf:resource="http://example.com/SAMUEL.owl#Concept"/> </Concept> <Concept rdf:about="#ID8"> <rdfs:label>Infraestructuras básicas de red local</rdfs:label> <vcard:SORT-STRING>1</vcard:SORT-STRING> <dcterms:isPartOf rdf:resource="#ID3"/> <rdf:type rdf:resource="http://example.com/SAMUEL.owl#Concept"/> </Concept> <Concept rdf:about="#ID9"> <rdfs:label>Instalación y configuración de redes de área local LAN</rdfs:label> <vcard:SORT-STRING>2</vcard:SORT-STRING> <dcterms:isPartOf rdf:resource="#ID3"/> <rdf:type rdf:resource="http://example.com/SAMUEL.owl#Concept"/> </Concept> <rdf:Description rdf:about="#ID9"> <dcterms:requires rdf:resource="#ID8"/> </rdf:Description> </rdf:RDF>
Donde Concept es la clase que representa a un tema, rdf:about es el id del tema, rdfs:label es el nombre del tema, dcterms:isPartOf es la relación tema-subtema apuntando al id del tema padre yvcard:SORT-STRING es el orden del tema (orden entre temas del mismo nivel, es decir, temas hermanos). Además, se pueden especificar relaciones de prerrequisitos entre temas. Para ello se usa el elemento dcterms:requires, indicando el id del concepto requerido.
actions
Cadena en formato XML con las acciones asociadas a cada concepto. Permite un valor nulo o cadena vacía si no se desean asociar acciones.
El XML Schema que debe cumplir dicho XML puede ser consultado aquí.
Ejemplo:
<Actions target="_blank"> <Concept id="1"> <Action name="Test" url="http://www.siette.org..."></Action> </Concept> ... </Actions>
configuration
Cadena en formato XML que permite definir el aspecto que mostrará el visualizador de modelos.
El XML Schema que debe cumplir dicho XML puede ser consultado aquí.
Ejemplo:
<Configuration>
<user>Ivan</user>
<course>Programming C</course>
<source>Siette</source>
<lang>en</lang>
<palette>
<byName>ylgn9</byName>
<custom>
<colors>
<fromColor>#ff0000</fromColor>
<toColor>#00ff00</toColor>
</colors>
<levels>12</levels>
</custom>
</palette>
<showHeader>true</showHeader>
<showFrame>true</showFrame>
<showTaskPanel>True</showTaskPanel>
<showGraphPanel>True</showGraphPanel>
<defaultView>spacetree</defaultView>
<views><view>spacetree</view><view>sunburst</view><view>table</view><view>text</view></views>
<urlCallback>http://www.example.com</urlCallback>
<actionListTitle>Learning Activities</actionListTitle>
</Configuration>
Donde:
- user: nombre del alumno (se mostrará en la cabecera). Permite un valor nulo.
- course: nombre del curso (se mostrará en la cabecera). Permite un valor nulo.
- source: nombre del sistema e-learning (se mostrará en la cabecera). Permite un valor nulo.
- lang: idioma en el que se mostrará la interfaz (en o es). Permite un valor nulo. Por defecto se usará es.
- palette: paleta de colores a usar por Ingrid para representar el nivel de conocimiento. Hay dos diferentes formas de especificar la paleta:
- Por nombre: usando el elemento byName con alguno de los siguientes nombres de paletas:
- rdylgn11 11 colores entre el rojo y verde,
- rdylgn9 9 colores entre el rojo y verde,
- ylgn9 9 colores entre el blanco y verde, y
- greens9 9 colores entre el blanco y verde.
- Por colores: usando los elementos fromColor, toColor y levels. Ingrid crea una paleta de levels de colores entre los valores indicados en fromColor y toColor.
- Por nombre: usando el elemento byName con alguno de los siguientes nombres de paletas:
- showHeader: valor booleano que indica si se muestra o no la cabecera. Permite valor nulo, su valor por defecto es true.
- showFrame: valor booleano que indica si se muestra o no Ingrid en un marco externo. Permite valor nulo, su valor por defecto es true.
- showTaskPanel: valor booleano que indica si se muestra o no el panel de tareas.
- showGraphPanel: valor booleano que indica si se muestra o no el panel de conceptos sin adyacentes en el gráfico en la vista de prerrequisitos.
- defaultView: vista por defecto.
- views: las vistas que se desean mostrar. Por defecto se muestran todas las vistas disponibles. La vista de texto sólo está disponible si el idioma es Español(es).
- urlCallback: dirección URL encargada de procesar las notas propuestas por el usuario. Si no se indica ningún valor (nulo o la cadena vacía), se desactivará la opción de edición de notas. Para más información consulte Edición de notas.
- actionListTitle: Título de la lista de acciones.
Todos estos elementos son opcionales, Ingrid usará valores por defecto si alguno de ellos es omitido.
Edición de Notas
INGRID está ideado para representar los modelos de usuario que se le proporcionen, por lo que no mantiene ningún registro de información. No obstante, ofrece una funcionalidad que permite a los usuarios añadir una determinada nota para cada concepto representado.
INGRID sólo actúa de intermediario entre el usuario y el sistema responsable del modelo de usuario. Por ello, al invocar INGRID se permite añadir una dirección URL que será donde se enviará la información escogida por el usuario. Es el propio sistema gestor de modelos de usuarios quien deberá desarrollar el programa apropiado alojado en la URL que se especifique. En esta sección se ofrece una guía básica para desarrollar apropiadamente este mecanismo.
Se define una sencilla interfaz de comunicación entre INGRID y el sistema invocador que consta de una serie de parámetros de entrada y un formato concreto de salida. La aplicación proporcionada puede estar desarrollada en cualquier tecnología y el único requisito es que permita ser invocada mediante una URL. Los parámetros que añade INGRID en su llamada a la URL configurada son los siguientes:
- concept: nombre del concepto para el que se proporciona la nota.
- mark: valor numérico proporcionado por el usuario, en el rango 1-5.
- callback: cadena de texto necesaria para la confirmación de recepción.
Por ejemplo, una invocación de INGRID que se haya configurado con la URL http://dominio/servlet podría hacer una llamada como la siguiente: http://dominio/servlet?concept=Programación&mark=4&callback=_jqjsp.
Nótese que se puede configurar la URL con otros parámetros adicionales de forma que, si nuestra aplicación requiere más información, ésta puede ser incluida previamente en la URL. Por ejemplo, podríamos añadir el identificador del usuario, ya que INGRID lo desconoce, configurando la URL como http://dominio/servlet?user=7 de forma que la llamada resultante podría ser la siguiente: http://dominio/servlet?user=7&concept=Programación&mark=4&callback=_jqjsp.
Estos parámetros adicionales son opcionales y no tienen ningún tipo de restricción: pueden incluirse tantos como sean necesarios y con los nombres que sean convenientes. Lo único que INGRID garantiza es que se recibe un concepto y una nota. El resto de información necesaria para el gestor de modelos de usuario debe ser añadida explícitamente.
Respuesta de confirmación
En cuanto a la respuesta que espera INGRID por parte de la aplicación, debe seguir un formato determinado. Para confirmar que la inserción de la nota se ha realizado correctamente, debemos utilizar la cadena de texto recibida en el parámetro callback para formar una cadena con formato jsonp. En realidad, basta con añadir a dicha cadena unos paréntesis y unas llaves: ({}). Por ejemplo, para las llamadas expuestas anteriormente en las que el parámetro callback contenía el valor _jqjsp, la respuesta que se espera para una confirmación es: _jqjsp({}).
Respuesta de error
Si nuestra aplicación encuentra algún problema y quiere que INGRID informe al usuario de que ha ocurrido un error, basta con que no devuelva nada o cualquier cadena de texto diferente a la de confirmación. De esta forma el usuario sabrá que su acción no ha sido registrada correctamente en el sistema.
Ejemplo de integración mediante JSP
Generar artefactos del servicio web con wsimport
El primer paso es importar el servicio web dentro de nuestro proyecto Java. Existen varias formas de hacerlo, nosotros lo haremos con la aplicación wsimport. Dicho programa podemos encontrarlo en la carpeta bin de nuestra carpeta JDK (a partir de la versión 6) o bien en la librería JAX-WS.
Para usar la aplicación abrimos un terminal y nos situamos en la carpeta src de nuestro proyecto. A continuación escribimos la siguiente linea:
Esto nos creará el paquete myApp.ingrid y generará los ficheros .java necesarios para usar el servicio web de Ingrid. Si quitamos la opción -Xnocompile nos generará los .class y si quitamos la opción -p myApp.ingrid los ficheros se crearán en un paquete por defecto (lsi.iaia.medea.ingrid.external). Ya depende de cada caso usar las opciones que más nos convengan. Para más información visitar la documentación oficial.
Con esto ya podemos usar la operación connect como si fuese un método de una clase local.
Ejemplo
El ejemplo presentado es una llamada realizada mediante la herramienta soapUI:
Petición: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ext="http://external.ingrid.medea.iaia.lsi/"> <soapenv:Header/> <soapenv:Body> <ext:connect> <!--Required:--> <model><![CDATA[<Model> <Scores date="16-03-2011" lowBound="0" upperBound="10"> <Concept id="1" score="6"></Concept> <Concept id="2" score="8"> <Evidence date="05-10-2010" name="Test" score="5"/> <Evidence date="10-10-2010" name="Examen" score="Muy Bien"/> <Distribution> <Elem data="1" prob="0"/> <Elem data="2" prob="2"/> <Elem data="3" prob="8"/> <Elem data="4" prob="80"/> <Elem data="5" prob="10"/> </Distribution> <Comparative> <Elem data="1" prob="0"/> <Elem data="2" prob="2"/> <Elem data="3" prob="50"/> <Elem data="4" prob="38"/> <Elem data="5" prob="10"/> </Comparative> <TempModel> <Milestone date="10-03-2011" score="5"> <Distribution> <Elem data="1" prob="0"/> <Elem data="2" prob="2"/> <Elem data="3" prob="80"/> <Elem data="4" prob="8"/> <Elem data="5" prob="10"/> </Distribution> </Milestone> <Milestone date="16-03-2011" score="8"> <Distribution> <Elem data="1" prob="0"/> <Elem data="2" prob="2"/> <Elem data="3" prob="8"/> <Elem data="4" prob="80"/> <Elem data="5" prob="10"/> </Distribution> </Milestone> </TempModel> </Concept> <Concept id="3" score="5"> <Distribution> <Elem data="1" prob="2"/> <Elem data="2" prob="3"/> <Elem data="3" prob="70"/> <Elem data="4" prob="20"/> <Elem data="5" prob="5"/> </Distribution> <Comparative> <Elem data="1" prob="15"/> <Elem data="2" prob="20"/> <Elem data="3" prob="30"/> <Elem data="4" prob="20"/> <Elem data="5" prob="15"/> </Comparative> <TempModel> <Milestone date="10-03-2011" score="3"> <Distribution> <Elem data="1" prob="30"/> <Elem data="2" prob="50"/> <Elem data="3" prob="15"/> <Elem data="4" prob="5"/> <Elem data="5" prob="0"/> </Distribution> </Milestone> <Milestone date="16-03-2011" score="5"> <Distribution> <Elem data="1" prob="2"/> <Elem data="2" prob="3"/> <Elem data="3" prob="70"/> <Elem data="4" prob="20"/> <Elem data="5" prob="5"/> </Distribution> </Milestone> </TempModel> </Concept> </Scores> </Model>]]> </model> <!--Required:--> <ontology><![CDATA[<Ontology> <Concept id="1" name="Geografía"/> <Concept id="2" name="Europa"/> <Concept id="3" name="America"/> <Concept id="4" name="Rios de Europa"/> <Relationship idC1="2" type="part_of" idC2="1"/> <Relationship idC1="3" type="part_of" idC2="1"/> <Relationship idC1="4" type="requires" weight="40" idC2="2"/> </Ontology>]]> </ontology> <!--Optional:--> <actions><![CDATA[<Actions target="_blank"> <Concept id="2"> <Action name="Wikipedia" url="http://es.wikipedia.org/wiki/Europa"/> </Concept> <Concept id="3"> <Action name="Wikipedia" url="http://es.wikipedia.org/wiki/Am%C3%A9rica"/> </Concept> </Actions>]]> </actions> <!--Optional:--> <configuration><![CDATA[<Configuration> <user>John Doe</user> <course>Course name</course> <source>Component name</source> <lang>en</lang> <palette> <custom><levels>5</levels></custom> </palette> <showHeader>true</showHeader> <showFrame>true</showFrame> <defaultView>spacetree</defaultView> <views> <view>spacetree</view> <view>sunburst</view> <view>table</view> <view>graph</view> <view>text</view> </views> <actionListTitle>Learning Activities</actionListTitle> <showTaskPanel>true</showTaskPanel> <showGraphPanel>true</showGraphPanel> <bgFrameColor>#6a6a6a</bgFrameColor> <bgColor>#ffffff</bgColor> </Configuration>]]> </configuration> </ext:connect> </soapenv:Body> </soapenv:Envelope> Respuesta: <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:connectResponse xmlns:ns2="http://external.ingrid.medea.iaia.lsi/"> <return> http://ingrid.iaia.lcc.uma.es/ingrid.html?id=379d6b98106249389509a8e04b47b7f1 </return> </ns2:connectResponse> </S:Body> </S:Envelope>