53
Manual de Usuario de OCP2: Open Context Platform Versi´ on 0.1 Ram´ on Garc´ ıa Vigueras, Juan Antonio Bot´ ıa Blaya [email protected] , [email protected] Septiembre 2010 1

Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

Manual de Usuario de OCP2: OpenContext Platform

Version 0.1

Ramon Garcıa Vigueras, Juan Antonio Botıa [email protected] , [email protected]

Septiembre 2010

1

Page 2: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Indice

1. Introduccion 31.1. Audiencia y Contenido del documento . . . . . . . . . . . . . . . 3

2. OSGi: Open Services Gateway Initiative 5

3. OCP2: Open Context Platform 2 7

4. Instalacion del bundle OCP2 en OSGi 84.1. Diseno de la ontologia de dominio en Protege . . . . . . . . . . . 84.2. Fichero de configuracion config.props . . . . . . . . . . . . . . . . 114.3. Instalacion del bundle OCP2 en Knopflerfish . . . . . . . . . . . . 13

4.3.1. Elementos necesarios para la instalacion . . . . . . . . . . 134.3.2. Instalacion del bundle OCP2 en Knopflerfish . . . . . . . . 14

5. API OCP2 17

6. Depuracion de bundles con el IDE NetBeans 23

7. Productores y Consumidores de contexto de OCP2 257.1. Productor de Contexto. Interfaz ContextProducer . . . . . . . . . 257.2. Consumidor de Contexto. Interfaz ContextConsumer . . . . . . . 267.3. Modelo WhiteBoard . . . . . . . . . . . . . . . . . . . . . . . . . 27

8. Ejemplo de uso de OCP2 308.1. Bundle Productor. Cambio de Localizacion de las Enfermeras . . 308.2. Bundle Consumidor . . . . . . . . . . . . . . . . . . . . . . . . . . 328.3. Diagrama de secuencia entre los bundles del ejemplo . . . . . . . . 338.4. Razonamiento Axiomatico en el Ejemplo . . . . . . . . . . . . . . 358.5. Ficheros de manifiesto de los bundles del ejemplo . . . . . . . . . 36

9. Conclusiones 39

10.Anexo A. Codigo del bundle Productor 40

11.Anexo B. Codigo del bundle Consumidor 44

12.Anexo C. Codigo OWL de la ontologıa base de OCP2 47

13.Anexo D. Codigo OWL de la ontologıa de dominio del proyectoCardinea 48

2

Page 3: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

1. Introduccion

El middleware OCP2 nos va a permitir desarrollar aplicaciones sensibles al con-texto (context-aware), almacenando la informacion de contexto en una ontologıa.En los anos recientes, las ontologıas estan siendo una parte fundamental dentrode muchas aplicaciones. Algunos ejemplos como los portales de los conocimientoscientıficos, la gestion de la informacion, el comercio electronico, y los servicios deweb semanticos estan basados en ontologıas.

En este manual se describira como acceder al servicio de gestion de informacioncontextual OCP2 dentro de un framework OSGi. Asumimos que el lector conocela especificacion OSGi, al menos los conceptos basicos. Para mas informacionconsultar la especificacion oficial en [1] y [2] o tambien en la url: 1. Tambientenemos abundante documentacion en el sitio web de la implementacion de OSGiKnoplerfish 2.

Se mostrara como instalar OCP2 en OSGi en la implementacion Knopflerfish ycomo acceder al servicio “ContextService” que OCP2 como bundle registrara enOSGi. Mediante este servicio OSGi se puede acceder a todos los servicios queOCP2 ofrece, principalmente a la escritura de contextos y suscripcion a cambiosde contextos concretos. Este servicio sera accesible a cualquier bundle que seinstale en OSGi, siempre que el servicio “ContextService” este disponible.

1.1. Audiencia y Contenido del documento

El documento es de especial interes para los usuarios de OCP2 ya que se mostrara co-mo instalar OCP2 en OSGi, la forma de acceder al servicio, y un ejemplo de-mostracion de su uso.

Por otra parte el documento esta estructurado de la siguiente manera:

En la seccion 1 se hara una descripcion con mas detalle al framework OSGi, sufuncion, y los tipos de bundles que pueden instalarse en el.

La seccion 2 se centrara en OCP2. Se hara una breve descripcion y se citaran suscaracterısticas principales.

En el apartado 3 explicaremos paso a paso la instalacion de OCP2 como bundleen la implementacion OSGi Knopflerfish.

En la seccion 4 detallamos la API de OCP2.

El apartado 5 mostramos un metodo para depurar nuestros bundles desde el IDENetBeans.

1http://www.osgi.org/Main/HomePage2http://www.knopflerfish.org

3

Page 4: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

En la seccion 6 se mostraran las interfaces “ContextProducer” y “ContextCon-sumer” que dan acceso al servicio “ContextService” y que los bundles que losbundles productores y consumidores de contexto deben implementar. A contin-uacion y en concordancia con lo anterior se muestra un metodo de acceso a losservicios que registran los bundles en OSGi, el metodo whiteboard que simplificala implementacion de los clientes del servicio OCP2.

En el apartado 7 se presentara un ejemplo de uso de OCP2 por parte de dos bun-dles, un bundle productor de contexto y otro bundle consumidor. Se explicara lafuncion que tiene el fichero de manifiesto para resolver las dependencias entre losbundles. Se mostraran los ficheros de manifiesto de los bundles del ejemplo y elfichero de manifiesto del bundle OCP2.

Por ultimo en la seccion 8 se aportaran las conclusiones mas relevantes del doc-umento.

4

Page 5: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

2. OSGi: Open Services Gateway Initiative

OSGi hace referencia a las siglas (Open Services Gateway Initiative), fue pensadoprincipalmente para su aplicacion en redes domesticas y por ende en la llamadadomotica o informatizacion del hogar.

Se podrıa definir como un sistema (o framework) modular para Java que es-tablece las formas de crear modulos y la manera en que estos interactuaran entresı en tiempo de ejecucion. OSGi intenta solventar los problemas del tradicional“classloader” de la maquina virtual y de los servidores de aplicaciones Java. EnOSGI, cada modulo tiene su propio classpath separado del resto de classpath delos demas modulos.

Las unidades (o programas) instalables en OSGi se llaman bundles o modulos.Un bundle es un proyecto Java empaquetado en un fichero JAR, que contienelas clases en java de la interfaz del servicio que registrara en OSGi, su imple-mentacion, y un poco de meta-informacion en un fichero de manifiesto que con-tiene atributos especiales para el sistema OSGi.

Este framework proporciona a los desarrolladores un entorno orientado a serviciosy basado en componentes, ofreciendo estandares para manejar los ciclos de vidadel software.

OSGi esta divido en capas, los nombres de estas son:

· Security Layer.

· Module Layer.

· Life Cycle Layer.

· Service Layer.

· Execution Environment.

No vamos a entrar en detalle en la funcion que desempena cada capa, si queremosobtener mas informacion sobre OSGi y su arquitectura podemos encontrarla en supagina web 3. Tambien existe el siguiente paper [3] donde se explica con claridadsu arquitectura.

La principal funcion de OSGi es la de registrar servicios en su sistema por partede los bundles. Un servicio es un objeto java que es registrado bajo una o variasinterfaces. Los bundles pueden registrar servicios para que otros bundles puedanusar el servicio “publicado”, buscarlos, o recibir notificaciones cuando el estado deun servicio ha sufrido alguna variacion. En nuestro caso OCP2 registrara en OSGiel servicio “ContextService” que los productores y los consumidores utilizaranpara generar y consumir contexto.

3http://www.osgi.org/Main/HomePage

5

Page 6: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

En OSGi hay dos tipos de bundles:

· Librerias que se instalan para ser compartidas con otros bundles.

· Aplicaciones ejecutables dentro de OSGi. OCP2 estarıa incluido dentro de estetipo.

En la siguiente seccion veremos una descripcion amplia del middleware OCP2 yexplicaremos sus principales caracterısticas.

6

Page 7: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

3. OCP2: Open Context Platform 2

OCP2 es un middleware para desarrollar aplicaciones sensibles al contexto (context-aware). Su uso esta basado en el paradigma publish-subscribe. Un productor, porejemplo un sensor, introduce informacion en el sistema; uno o varios consumi-dores interesados en determinada informacion de contexto son notificados de loscambios en esta informacion. La informacion de contexto se almacena en unaontologıa, definida segun un modelo de contexto creado por el desarrollador, quecumple con el estandar OWL [W3C 2004a].

Algunas caracterısticas del middleware OCP2:

· Abierto: El sistema permite que dispositivos, con diferentes arquitecturas hard-ware y software , entren a participar en el sistema.

· Dinamico: El sistema permite que nuevos elementos(por ejemplo, nuevos sen-sores o nuevos consumidores de informacion de contexto como servicios, etc.)entren o salgan del sistema. Estos cambios se pueden realizar en caliente, con elsistema funcionando, y sin alterar el funcionamiento de los demas elementos delsistema.

· General: Se ha disenado para que la solucion que aporte sea general, los im-plementadores de una aplicacion concreta necesitan mas tiempo para adaptar elsistema a un dominio concreto, y por otro lado el sistema es flexible en cuantoa los dominios de aplicacion, es decir, no esta atado a un solucion concreta. Dehecho lo primero que hay que hacer antes de usar OCP2 es disenar un modelo dedominio en OWL.

El sistema esta compuesto por dos partes fundamentales. Por un lado tenemosun modelo de informacion en una ontologıa donde se almacenara la informa-cion de contexto. Y por otro lado tenemos un servicio en OSGi (ContextService)para gestionar esta informacion, este servicio sera usado por los consumidores yproductores de contexto.

No es el objetivo de este documento presentar en detalle la implementacion y laarquitectura de OCP2, pero si dar una breve descripcion de lo que representa ycuales son sus caracterısticas mas importantes como hemos visto anteriormente.Si alguien quiere ver los detalles de la implementacion recomendamos la lecturadel documento [4], que se puede encontrar en la pagina web: 4 en el se pueden en-contrar todos los detalles de la arquitectura, el modelo de contexto, o los metodosde acceso a OCP2.

4http://ants-webs.inf.um.es/ocp2/

7

Page 8: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

4. Instalacion del bundle OCP2 en OSGi

El primer paso que tenemos que hacer es descargar el paquete software dondeesta el bundle OCP2. Para ello nos dirigimos a la pagina web de OCP2 5 y en laseccion descargas pinchamos en el enlace “Release OCP2 (Bundle OSGi)”.En nuestra maquina se nos descargara un fichero .rar que se llama “ocp2.rar”.Al descomprimir el fichero podemos ver que esta formado por unos cuantos di-rectorios y dos ficheros, vamos a detallar brevemente cada uno de ellos:

· Fichero “changes.txt”. Fichero que contiene los cambios realizados en OCP2desde la version 2.0.1.

· Directorio “build”. Directorio que contiene el bundle ocp2 y su fichero deconfiguracion “config.props”.

· Directorio “libs”. Directorio que contiene las librerias necesarias para compilarel codigo fuente de OCP2.

· Directorio “ontologies”. Directorio que contiene la ontologıa base (fichero“ocp2.owl”), la ontologıa de dominio del proyecto Cardinea que usaremos comoejemplo (fichero “cardineaOntology.owl”) y el fichero “swrl.owl” necesario paraintroducir las reglas swrl a la ontologıa de dominio.

· Directorio “osgi”. Contiene los bundles org.apache.commons.logging 1.0.4.jary OCP2lib.jar necesarios para el funcionamiento del bundle OCP2.

· Directorio “src”. Contiene el codigo fuente para compilar OCP2.

· Directorio “docs”. Directorio que contiene los documentos en los que hacemosreferencia en este manual.

4.1. Diseno de la ontologia de dominio en Protege

Vamos a detallar paso a paso el proceso que se tiene que realizar para instalar elbundle OCP2 en nuestro sistema. Antes de instalar los bundles en Knopflerfishhay que realizar una serie de tareas en un primer lugar. El primer paso que hayque dar es crear una ontologıa de dominio que importara la ontologıa base deOCP2.

La ontologıa base de OCP2 (“fichero ocp2.owl”), como podemos ver en la figura1, la importan tanto la ontologıa de dominio como la ontologıa del historico. Con-tiene la clase “ContextEntity” que define las propiedades basicas de las entidadesque poseen contexto.

5http://ants-webs.inf.um.es/ocp2/

8

Page 9: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Figura 1: Esquema de alto nivel del modelo con la ontologıa cargada en OCP2

La ontologıa de dominio describe el dominio de la aplicacion. Su esquema repre-senta el modelo de contexto proporcionado por el desarrollador. Para crearla sepuede usar un editor de OWL, por ejemplo Protege.

Protege es un editor libre y de codigo abierto con el que podemos empezar a crearnuestra primera ontologıa.

Podemos descargar el editor Protege desde su pagina web 6, registrandonos pre-viamente. Se recomienda descargar la version 3.3.1, ya que parece ser la masestable de todas.

Una vez que hemos instalado el editor, al ejecutarlo nos aparecera una ventanacomo la que podemos ver en la figura 2.

Figura 2: Editor Protege

6http://protege.stanford.edu/

9

Page 10: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Como vemos, podemos abrir un proyecto ya existente o crear una ontologıa nueva.Crearemos una ontologıa nueva usando Protege.

Antes de empezar a crear las clases y propiedades de nuestra ontologıa debemosimportar la ontologıa base de OCP2. Para ello, simplemente deberemos localizarel fichero “ocp2.owl”, que contiene la ontologıa base de OCP2 y la definicion delas propiedades de la clase “ContextEntity”. La forma de importarla es pulsando

el siguiente icono . Una vez pulsado nos aparecera el menu de la figura 3.

Figura 3: Menu para importar una ontologıa base en Protege

Como vemos en la figura, elegimos la segunda opcion “Import an ontologycontained an specific local file” y buscamos la ruta donde tengamos el fichero“ocp2.owl”.

Una vez importado el fichero “ocp2.owl” ya podemos empezar a crear nuestraontologıa de dominio. En la pagina web del editor 7 podemos encontrar muchosmanuales para iniciarse en el uso de Protege.

En el directorio “ontologies” del paquete software existe un ejemplo de una on-tologıa de dominio ya creada en el fichero “cardineaOntology.owl”. El ejemplopuede ser cargado desde Protege siguiendo los pasos citados anteriormente. Des-de el editor se pueden ver sus clases y las propiedades que tiene cada una de ellas.Podemos ver un diagrama de las clases que forman la ontologıa del ejemplo enla figura 4. Este ejemplo corresponde a un modelo de contexto de un hospitalcreado para el proyecto Cardinea.

7http://protege.stanford.edu/

10

Page 11: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Figura 4: Ontologia de dominio del proyecto Cardinea

Como podemos observar en la figura 4 las clases Persona, Medicamento, Rfid,Antena o Localizacion son subclases de “ContextEntity”. En este diagrama nohay instancias, solo define el esquema de la ontologıa, las clases que lo van aformar y las propiedades de cada una de ellas.

En OCP2, una instancia de una clase que herede de “ContextEntity” es unaentidad con contexto, y su contexto es el valor de sus propiedades. El modelo dedominio del ejemplo, define las entidades que poseen contexto y la informacionde contexto que tienen, ya sea estatica o dinamica.

Para una informacion mas tecnica del modelo de contexto de OCP2 trasladamosal lector al documento [4].

Como hemos visto el modelo de contexto lo proporciona el desarrollador, OCP2no define ningun modelo de contexto. De esta forma no se limita el numero deaplicaciones que puedan usar OCP2.

4.2. Fichero de configuracion config.props

En OCP2 debe existir un fichero con el nombre “config.props” que contiene laconfiguracion del servicio OCP2 para un modelo de contexto concreto. En elpaquete software hay un ejemplo de este fichero en la carpeta “build”. El ficheroesta configurado para la la ontologıa de dominio de ejemplo que hemos visto enla seccion anterior.

El fichero de configuracion “config.props” debe situarse siempre en el direc-torio donde se encuentre el fichero ocp2.jar, ya que cuando instalemos elbundle OCP2 este buscara el fichero de configuracion para leer sus propiedadesen esa ruta.

Antes de iniciar el bundle OCP2 hay que editar el fichero y cambiar la ruta de losficheros .OWL donde tengamos guardadas nuestras ontologıas base y de dominio.Las propiedades que hay que cambiar son modelOntologyURL, baseOntolo-gyURL y swrlURL del fichero “config.props”.

11

Page 12: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Imaginemos que guardamos los ficheros de ejemplo que vienen en la carpeta“ontologies” en la carpeta “Mis documentos” en Windows XP, las rutas validaspara los ficheros .OWL serıan las siguientes:

·modelOntologyURL=file:///c:/Documents and Settings/Administrador/Misdocumentos/ontologies/cardineaOntology.owl

· baseOntologyURL=file:///c:/Documents and Settings/Administrador/Misdocumentos/ontologies/ocp2.owl

· swrlURL=file:///C:/Documents and Settings/Administrador/Mis documen-tos/ontologies/swrl.owl

Como vemos en el ejemplo, el texto en rojo corresponde a la ruta donde seencuentran los ficheros .OWL de nuestras ontologias base y de dominio, ası comoel fichero swrl.owl.

A continuacion se muestra una tabla con los detalles de cada una de las propiedadesdel fichero “config.props”:

12

Page 13: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

modelOntologyNameSpace Namespace de la ontologıa que definenuestro modelo de contexto.

modelOntologyURL URL del fichero OWL de la ontologıa denuestro modelo.

baseOntologyNameSpace http://www.um.es/Ontology/ocp2.0.1.owlbaseOntologyURL URL del fichero OWL con la ontologia de ocp2swrlNameSpace Namespace de la ontologıa que define

nuestro modelo de contexto.swrlURL URL del fichero OWL con la ontologia swrl.dbDriver=com.mysql.jdbc.Driver Ejemplos de parametros de configuraciondbUrl=jdbc:mysql://localhost/test para una bbdd MySql.dbUser=root Actualmente no se usa.dbPassword=****dbName=MySQLhistoryWriteType Tipo de historico:

All: Almacena todo (por defecto)onlyDiff1: Solo valores diferentesonlyDiff2: Valores diferentes el primero y ultimonone: No almacena historico

historyWriteLimit CLASSNAME Numero de instancias a almacenaren las entidades de clase CLASSNAME.Limita el numero de ultimos valoresalmacenados para una entidad.

dbClean Si es true borrara la BBDD al arrancar ocp2.reasoning Posibles valores son:

off (por defecto)rules ?full ?

areasoner Razonador Axiomatico usado:pellet: Se usa Pellet (default)jena: Se usa Jenaoff: No se usa razonamiento axiomatico

Tabla 1: Tabla con las propiedades del fichero config.props

4.3. Instalacion del bundle OCP2 en Knopflerfish

4.3.1. Elementos necesarios para la instalacion

Hemos visto en las secciones anteriores como se puede disenar una ontologıade dominio con el editor Protege y la configuracion del fichero “config.props”.

13

Page 14: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

A partir de aquı ya podemos instalar el bundle OCP2. Veamos cuales son loselementos que necesitamos para la instalacion.

Los bundles principales que forman el sistema OCP2 son los siguientes:

· ocp2.jar: Es el bundle OCP2, contiene la API necesaria para escribir y modificarcontexto. Registra en OSGi el servicio “ContextService”.

· OCP2lib.jar: Bundle que contiene librerias necesarias para que OCP2 funcioneen OSGi.

· org.apache.commons.logging 1.0.4.jar: Bundle que realiza funciones de log. Nece-sario para resolver dependencias con el bundle OCP2lib.jar

Ontologıas necesarias:

· Ontologia Base: Se encuentra en el fichero ocp2.owl

· Ontologia de dominio: En nuestro caso usaremos la ontologıa creada para elproyecto Cardinea. Se encuentra en el fichero cardineaOntology.owl.

Ficheros de configuracion:

· Fichero config.props: Contiene la configuracion del servicio OCP2 para un mod-elo de contexto concreto.

4.3.2. Instalacion del bundle OCP2 en Knopflerfish

Vamos a usar la implementacion de OSGi Knopflerfish para la instalacion y uso deOCP2. Actualmente la ultima version es la version 3.0.0. Podemos descargarlaen la pagina web oficial 8.

Una vez descargado Knopflerfish, tenemos que asegurarnos que lo instalamos conla version 1.6 del JDK de java ya que el bundle OCP2 ha sido compilado conesta version. Si tenemos varios JDK instalados en nuestra maquina, deberemosde asegurarnos que estamos usando la version 1.6 por defecto. Si instalamosKnopflerfish con un JDK inferior a la version 1.6 el bundle OCP2 nos dara unerror cuando lo ejecutemos, ya que estaremos ejecutandolo desde un JDK inferiorsobre el cual ha sido compilado. Una manera de saber que JDK esta utilizandoKnopflerfish es mirando la informacion del framework. Para ello desde el desktopde Knopflerfish tendremos que navegar hasta el menu Help\Framework infoy se abrira una ventana como la de la figura 5

8http://www.knopflerfish.org/download.html

14

Page 15: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Figura 5: Informacion del framework Knopflerfish

En la figura 5 vemos informacion del framework. Si nos fijamos, en la linea ja-va.especification.version podemos saber la version del JDK que esta utilizandoKnopflerfish.

Una vez hayamos instalado Knopflerfish, este viene con varios bundles que ofre-cen la funcionalidad de una consola para OSGi. Se puede acceder mediante unaconsola de escritorio (la que vamos a usar), por tcp o telnet, incluso medianteuna consola especial para http. Nosotros accederemos mediante la consola deescritorio ejecutando el fichero “knopflerfish.jar” como se aprecia en la figura 6:

Figura 6: Consola del Framework Knopflerfish

La interfaz es muy intuitiva a la hora de cargar, ejecutar, parar y desinstalarbundles. Los botones que desempenan estas funciones se encuentran en la barrade herramientas y son los siguientes:

· Instala un bundle.

15

Page 16: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

· Ejecuta un bundle ya instalado.

· Para un bundle.

· Desinstala un bundle.

En la url 9 podemos encontrar una descripcion mas completa sobre el desktop deknopflerfish y otros temas relacionados.

Una vez que Knopflerfish se ha iniciado, el ultimo paso es instalar los bundles, paraello, unicamente hay que buscarlos en la ruta donde esten localizados pulsando

el boton .

Al instalar los bundles en Knopflerfish estos automaticamente se ejecutan, paraque no tengamos ningun problema de dependencias de librerias, el orden parainstalarlos es el siguiente:

1. org.apache.commons.logging 1.0.4.v20080605-1930.jar

2. OCP2lib.jar

3. ocp2.jar

Si todo ha ido bien, en la consola deben aparecer los mensajes que vemos enla figura 7 indicandonos que OCP2 se ha cargado correctamente y ya podemosempezar a usarlo.

Figura 7: Mensajes indicandonos que el bundle OCP2 se ha cargado correcta-mente

Como vemos casi todos los mensajes que se pueden apreciar en la figura 7 hacenreferencia a que las ontologias se han cargado correctamente. Tambien se muestrael numero de clases que tiene nuestra ontologıa de dominio.

9http://www.knopflerfish.org/releases/current/docs /bundledoc/index.html

16

Page 17: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

5. API OCP2

El bundle OCP2 registra en OSGi el servicio ContextService. La API que ponea disposicion para el uso de los demas bundles se muestra a continuacion.

Los metodos son los siguientes:

· public int setContextItem(String entityName, String id, String atribute-Name, int valor)

Establece el valor de tipo entero de una propiedad para una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

atributeName: Nombre de la propiedad a cambiar.

valor: nuevo valor.

· public boolean setContextItem(String entityName, String id, StringatributeName, boolean valor)

Establece el valor de tipo boolean de una propiedad para una entidad con con-texto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

atributeName: Nombre de la propiedad a cambiar.

valor: nuevo valor.

· public boolean setContextItem(String entityName, String id, StringatributeName, float valor)

Establece el valor de tipo float de una propiedad para una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

atributeName: Nombre de la propiedad a cambiar.

valor: nuevo valor.

17

Page 18: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

· public boolean setContextItem(String entityName, String id, StringatributeName, String valor)

Establece el valor de tipo string de una propiedad para una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

atributeName: Nombre de la propiedad a cambiar.

valor: nuevo valor.

· public boolean setContextItem(String entityName, String id, StringatributeName, Date valor)

Establece el valor de tipo Date de una propiedad para una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

Id: Identificador de la entidad.

atributeName: Nombre de la propiedad a cambiar.

valor: nuevo valor.

· public boolean setContextItemRelation(String entityClassName,Stringid, String relationName, String entity2ClassName,String entity2Id)

Establece el valor de tipo relacion de una propiedad para una entidad con con-texto. Una relacion es: una asociacion entre la entidad que modificamos y otraentidad.

Parametros:

entityClassName: Clase de la entidad

id: Identificador de la entidad

relationName: Nombre de la propiedad de tipo relacion a cambiar

entity2ClassName: Clase de la entidad con la que se asocia

entity2Id: Id de la entidad con la que se asocia

· public boolean setContextItems(ContextEntityItems items)

Establece el valor de un conjunto de propiedades de una entidad (ContextEntity).

Parametros:

18

Page 19: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

items: Conjunto de items a cambiar.

· public int getContextItemInt(String entityName, String id, StringpropertyName)

Obtiene el valor de tipo entero de una propiedad de una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

propertyName: Nombre de la propiedad que queremos.

· public float getContextItemFloat(String entityName, String id, StringpropertyName)

Obtiene el valor de tipo float de una propiedad de una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

propertyName: Nombre de la propiedad que queremos.

· public boolean getContextItemBoolean(String entityName, String id,String propertyName)

Obtiene el valor de tipo boolean de una propiedad de una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

propertyName: Nombre de la propiedad que queremos.

· public String getContextItemString(String entityName, String id,String propertyName)

Obtiene el valor de tipo string de una propiedad de una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

propertyName: Nombre de la propiedad que queremos.

19

Page 20: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

· public Date getContextItemDate(String entityName, String id, StringpropertyName)

Obtiene el valor de tipo Date de una propiedad de una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

propertyName: Nombre de la propiedad que queremos.

· public ContextItemRelation getContextItemRelation(String entity-Name, String id, String propertyName)

Obtiene el valor de una propiedad de tipo relacion de una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

propertyName: Nombre de la propiedad que queremos.

· public ContextEntityItems getContextItems(String entityName, Stringid)

Obtiene todas las propiedades de una entidad con contexto.

Parametros:

entityName: Clase de la entidad.

id: Identificador de la entidad.

· public List<String> getContextEntityIds(String entityName)

Obtiene todos los IDs de un tipo de entidad con contexto. Es decir, obtiene losids de todos los individuos de esta clase de entidad.

Parametros:

entityName: Clase de la entidad.

· public boolean register(String entityName, String id, ContextCon-sumer cl)

Registrarse a los cambios de un contexto concreto.

Parametros:

entityName: Nombre de la entidad.

20

Page 21: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

id: Identificador del contexto en el que estamos interesados.

cl: Interfaz del consumidor de contexto que recibira las notificaciones.

· public boolean register(String entityName, ContextConsumer cl)

Subscribe un oyente(ContextConsumer) a un tipo de contexto.

Parametros:

contextType: tipo del contexto (ej. Medicamento en Medicamento-12132).

cl: Oyente que implementa la interfaz ContextConsumer.

· public boolean unregister(String id, ContextConsumer cl)

Desregistrarse a los cambios de un contexto concreto.

Parametros:

id: Identificador del contexto.

cl: Interfaz del consumidor de contexto.

· public int historyGetContextEntityLenght(String entityClassName,Stringid)

Obtiene el numero de contextos almacenados en el historico de un contexto con-creto.

Parametros:

entityClassName: Nombre de la entidad.

id: Identificador del contexto.

· public List <ContextEntityItems> historyGetContextEntityAll (StringentityName, String entityId)

Obtiene todos estados anteriores del historico una entidad concreta.

Parametros:

entityName: Clase de la entidad.

entityId: Id de la entidad.

· public Vector<ContextEntityItems>historyGetContextEntityLastN(StringentityName, String entityId, int lastN)

Obtiene los N estados anteriores del historico una entidad concreta. No devuelveel estado actual. El vector que devuelve esta ordenado de antiguo a nuevo.

21

Page 22: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Parametros:

entityName: Clase de la entidad.

entityId: Id de la entidad.

LastN: Estados anteriores del historico que se quieren obtener.

· public void writeModel(String filename)

Escribe el modelo actual en owl.

Parametros:

filename: Nombre del fichero donde se guardara el modelo actual en formato.OWL.

22

Page 23: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

6. Depuracion de bundles con el IDE NetBeans

A la hora de crear nuevos bundles que vayan a utilizar el servicio “ContextService”que OCP2 registra en OSGi, puede ser que nos surjan problemas y queramos verexactamente en que lınea de codigo falla nuestro bundle. Knopflerfish nos suelemostrar el error y su causa en la consola, pero muchas veces es conveniente verlopor nosotros mismos ya que la verdadera causa del error no concuerda con lo quenos esta mostrando Knopflerfish. Para ello lo mejor es depurar nuestro bundlepaso a paso hasta llegar a la lınea de codigo que esta fallando y ver exactamenteque esta ocurriendo.

Para la creacion de nuevos bundles hemos utilizado el IDE NetBeans. NetBeansse puede descargar desde su pagina web oficial 10, es un IDE de codigo abierto ycon una gran comunidad de usuarios que nos permite realizar desarrollos en java.

Lo que tenemos que hacer para arrancar Knopflerfish desde NetBeans en mododepuracion utilizando Windows XP es lo siguiente:

Crearemos un acceso directo del fichero “framework.jar”, localizado en la carpeta\osgi dentro del directorio donde hayamos instalado Knopflerfish. Posteriormenteaccederemos a sus propiedades e insertaremos la siguiente lınea: 11 en el apartado“Destino”, como podemos observar en la figura 8.

Figura 8: Ventana de propiedades del acceso directo al fichero framework.jar

10www.netbeans.org11“C:\WINDOWS\system32\java.exe -agentlib:jdwp=transport=dt socket,server=y,address=8000

-jar framework.jar”

23

Page 24: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

El siguiente paso es ejecutar el acceso directo que acabamos de editar, se nosabrira una ventana como en la figura 9, informandonos que esta a la escucha porel puerto 8000.

Figura 9: Debugger en espera

El ultimo paso es abrir NetBeans y en el menu de depuracion adjuntar un depu-rador insertando el numero de puerto que queremos, en este caso el 8000. Podemosver una captura de la ventana en la figura 10

Figura 10: Ventana de NetBeans para adjuntar un depurador de java

Si todo ha ido bien, pulsando el boton Aceptar se abrira Knopflerfish en mododepuracion y podremos empezar a depurar nuestros bundles.

24

Page 25: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

7. Productores y Consumidores de contexto de

OCP2

7.1. Productor de Contexto. Interfaz ContextProducer

Un productor de contexto en OCP2 es un elemento del sistema que genera con-texto, por ejemplo, en un modelo de contexto correspondiente a un hospital unpaciente genera contexto con sus datos personales, su estado de salud, o su local-izacion.

Dentro de OCP2 los productores se identifican mediante una interfaz llamadaContextProducer. Esta interfaz hereda los metodos getId(), activate() y de-activate() de la interfaz ContextAgent. En la figura 11 tenemos un diagrama declases donde se puede apreciar que interfaces tiene que implementar la clase quesea productor de contexto de OCP2.

Figura 11: Diagrama de clases de un productor de contexto de OCP2

El metodo getId() se usa para identificarse en OCP2, actualmente este iden-

25

Page 26: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

tificador solo se usa en funciones de logging. El metodo activate() sirve paraque OCP2 nos envie la interfaz de acceso al servicio cuando un productor o unconsumidor se registran en OCP2. Con el metodo deactivate() informamos aOCP2 de que hemos dejado de ser productores de contexto.

7.2. Consumidor de Contexto. Interfaz ContextConsumer

Un consumidor de contexto en OCP2 es un elemento del sistema que consumecontexto, por ejemplo en el entorno de un hospital un doctor querra saber lainformacion que generen los pacientes.

Dentro de OCP2 los consumidores se identifican mediante una interfaz llamadaContextConsumer. Esta interfaz hereda los metodos getId(), activate() y deac-tivate() de la interfaz ContextAgent. Estos metodos cumplen la misma funcionque en los productores. En la figura 12 tenemos el diagrama de clases para elconsumidor de contexto de OCP2.

Figura 12: Diagrama de clases de un consumidor de contexto de OCP2

26

Page 27: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Como vemos en la figura 12 los consumidores ademas deben implementar losmetodos notifyContextChange() y notifyNewContext() de la interfaz Con-textConsumer(). El primero de ellos nos notifica de los cambios en contextosde una o varias entidades a las cuales estemos subscritos como consumidores.Para que nos lleguen estas notificaciones tendremos que registrarnos a los cam-bios de contexto de una entidad mediante el metodo register(). Podemos ver undiagrama de colaboracion en la figura 13. Por otra parte el metodo notifyNew-Context() nos notifica cuando se crea un nuevo contexto en el sistema.

Figura 13: Diagrama de clases de un consumidor de contexto de OCP2

7.3. Modelo WhiteBoard

En los anteriores apartados hemos presentado las Interfaces ContextProducer yContextConsumer que deben implementar cualquier productor o consumidor quequiera acceder al servicio “ContextService” del bundle OCP2. Esto lo hacemosası ya que dada la naturaleza dinamica de OSGi, el servicio podrıa no estardisponible en el momento de usarlo (o en el momento de consultar si existe).

En esta seccion vamos a explicar el modelo que seguimos para acceder por partede otros bundles al servicio que el bundle OCP2 registra en OSGi. Si el bundleOCP2 se actualizase, durante el periodo de actualizacion se parara el bundle ycon el los servicios que ofrece. Cualquier acceso durante este periodo nos darıauna excepcion.

27

Page 28: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

OSGi ofrece metodos para hacer un seguimiento de un servicio para que OS-Gi nos notifique si un servicio esta disponible o no. Por ejemplo mediante unServiceTracker o un ServiceListener podremos monitorizar servicios (como Con-textService) en OSGi. No vamos a describir ninguno de estos metodos, tan solodecir que estos metodos nos obligan a anadir mucho codigo de control.

Para evitar anadir demasiado codigo de control en los bundles que usen servicios,en OCP2 hemos optado por ofrecer un metodo de acceso alternativo, este meto-do se llama modelo whiteboard (de pizarra). Este nuevo metodo se basa en elpatron inversion de control. Consiste en que el bundle que quiera usar un servi-cio ServicioX registre un servicio UsuarioDeServicioX, expresando de esta formaque quiere ser usuario del ServicioX. El ServicioX esta a la escucha de todos losservicios de tipo UsuarioDeServicioX que se registran en el sistema. Cuando elservicio ServicioX observa un nuevo UsuarioDeServicioX en el sistema se pone encontacto con el.

En nuestro caso, un productor de contextos (el caso de un consumidor serıaanalogo a este) que quiere usar el servicio de OCP2 (ContextService) registra unservicio de tipo ContextProducer, OCP2 esta escuchando todos los servicios deeste tipo que se registran en el sistema. Una vez que el productor de contextosregistra un servicio en el directorio de OSGi, el servicio OCP2 es notificado,adquiere el servicio ContextProducer del productor y se pone en contacto con elmediante el metodo activate() indicandole que el servicio ContextService estadisponible y enviandole el interfaz de uso del servicio. Cuando OCP2 va a parar suservicio informa a los productores mediante el metodo deactivate() indicandolesque el servicio ya no esta disponible.

Podemos ver este modelo en la Figura 14.

Figura 14: Modelo WhiteBoard para el acceso al servicio de ContextService enOSGi

28

Page 29: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Como podemos ver, con este modelo el control pasa del cliente del servicio alproveedor del servicio. Asi, el productor de contexto no necesita crear codigoadicional para controlar la disponibilidad del servicio “ContextService”, OCP2 leavisara cuando no este disponible y cuando vuelva a estar disponible.

29

Page 30: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

8. Ejemplo de uso de OCP2

Vamos a detallar un ejemplo extraido del proyecto Cardinea. Nuestro modelo decontexto va a ser un hospital sensorizado, con personal sanitario trabajando enel. En la figura 1 tenemos el diagrama de la ontologıa de dominio que vamos ausar y las clases que hay definidas en el.

El ejemplo se basa en la lectura de las tarjetas Rfid que cada una de las enfermerasllevara para saber su localizacion dentro del hospital.

Cada una de las antenas genera una senal cada vez que detecta que ha pasa-do cualquier tarjeta Rfid por su ubicacion, van a ser por tanto, productores decontexto.

Suponiendo que cada antena esta ubicada en una localizacion distinta dentro delhospital, podemos saber en cada momento la localizacion de cada una de lasenfermeras que lleve una tarjeta Rfid cuando pasen por una antena.

En el ejemplo, introduciremos en OCP2 10 tarjetas Rfid, cada una de las cualeslas llevaran 10 enfermeras, y 3 Antenas que detectaran cada una de las tarjetascuando pasen por su radio de accion.

8.1. Bundle Productor. Cambio de Localizacion de las En-fermeras

Como hemos dicho antes, los productores de contexto van a ser las 3 antenas queiran detectando las diferentes tarjetas Rfid que pasan por un radio proximo a sulocalizacion.

La primera tarea que tenemos por delante es la de la creacion de las entidades enOCP2, para ello usamos el metodo entityCreation() como vemos en la figura 15

30

Page 31: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Figura 15: Metodo que crea las entidades necesarias

Podemos ver con el metodo entityCreation() como creamos los individuos quevan a formar parte del ejemplo. Un error muy frecuente que se puede cometercon mucha facilidad es el siguiente:

Cuando una entidad tiene un atributo que es una instancia de otra entidad nopodemos asociar el atributo a la entidad sin haber creado la entidad previamente.Un ejemplo de esto es por ejemplo el atributo “localizada en” de tipo Localizacionque tienen las entidades Enfermera, Rfid y Antena. Para asociar este atributocuando estamos creando dichas entidades en primer lugar hay que crear la entidadLocalizacion antes, como se aprecia en la figura 15.

Para simular el cambio de localizacion de las enfermeras generamos aleatoria-mente el “id” de las antenas y lo asociamos con una tarjeta Rfid, mediante elmetodo updateAntenaEvent() como se detalla en la figura 16.

31

Page 32: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Figura 16: Metodo que simula el cambio de localizacion por parte de las enfer-meras

Este metodo ademas, asocia la relacion existente entre Antena y Localizaciony tambien la relacion entre las entidades Enfermera y Rfid. Esto es ası porqueOCP2 no notifica lo que se infiere de forma axiomatica realmente, la informacionse recoge, pero no se hace explıcita. Por este motivo se tienen que anadir las dosultimas lıneas de codigo que relacionan a las antenas con una localizacion y a lasenfermeras con su tarjeta Rfid.

8.2. Bundle Consumidor

El bundle que hara de consumidor va a estar interesado en la localizacion de lasEnfermeras. Para ello debera registrarse a la entidad Enfermera para que OCP2le informe de los cambios de contexto de dicha entidad. En el metodo run() comovemos en la figura 17 nos registramos a la entidad Enfermera.

Figura 17: Metodo run() del bundle Consumidor

Una vez registrado el consumidor, en el metodo notifyContextChange() de la figu-ra 18, iremos recibiendo las notificaciones oportunas. Nos llegara como parametrola entidad a la que estamos registrados, y las propiedades que han cambiado enella, mediante esa entidad, mostraremos por pantalla los datos que deseemos conel metodo printContext() de la figura 19, en nuestro caso la localizacion de lasenfermeras.

32

Page 33: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Figura 18: Metodo notifyContextChange() del bundle Consumidor

Figura 19: Metodo printContext() del bundle Consumidor

Como vemos en la figura 19 con la API de OCP2 vamos obteniendo los datos quequeremos mostrar por pantalla, en nuestro caso queremos saber el nombre de laenfermera, la antena que la ha detectado y su localizacion.

Usando la API de OCP2 que hemos detallado en la seccion 4 de este manualpodemos ir mostrando todos estos datos. Con el metodo getContextItemString()podemos obtener un atributo de tipo String de cualquier entidad de la ontologıa,pasandole como parametros el nombre que de la entidad que hemos definido enla ontologıa de dominio, su identificador local en OCP2 “id”, y el nombre delatributo que queremos obtener, en este caso el nombre.

8.3. Diagrama de secuencia entre los bundles del ejemplo

Para entender mejor la ejecucion de los distintos bundles podemos ver un diagra-ma de secuencia en la 20

33

Page 34: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Figura 20: Diagrama de secuencia entre los bundles implicados en el ejemplo

En el diagrama de la figura 20 podemos ver un diagrama de secuencia entrelos distintos bundles. El diagrama nos muestra las sucesivas llamadas que re-alizan los bundles desde que se registran como productor y consumidor conbc.registerService() hasta que le llegan las notificaciones al consumidor desdeel bundle OCP2 indicandole de que ha habido cualquier cambio de contexto enla entidad Enfermera.

En un primer lugar en la figura 20 vemos las dos llamadas que realizan los bundlesproductor y consumidor utilizando el objeto “bc” de tipo BundleContext que nospermite registrarnos como Productor y Consumidor.

OSGi estara atento a todos los bundles que se registran en el sistema e infor-mara al bundle OCP2 de que hay dos bundles que se han registrado, uno co-mo productor y otro como consumidor de contexto. El bundle OCP2 los intro-ducira en sus listas de productores y consumidores y les dara acceso al servicio“contextservice” mediante la llamada activate(). Llegados a este punto ambosbundles pueden usar el servicio “contextservice”.

El productor introducira en OCP2 las entidades necesarias, mediante sucesivasllamadas al metodo setContextItem(). El consumidor se registrara a la entidadEnfermera mediante el metodo register(), para posteriormente el bundle OCP2

34

Page 35: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

le notifique de los cambios de localizacion que ocurren en las enfermeras medianteel metodo nofifyContextChange().

8.4. Razonamiento Axiomatico en el Ejemplo

Hasta ahora sabemos que las antenas van a ser los productores que van a irgenerando la informacion para los consumidores que la quieran saber, pero, ¿Co-mo se relaciona una enfermera con una antena y podemos saber su localizacion?.

Esto se consigue mediante el razonamiento axiomatico y la manera de relacionarlas clases de la ontologıa de dominio. En este ejemplo estan relacionadas las clasesEnfermera, Rfid, Antena y Localizacion, como podemos ver en la figura 21.

Figura 21: Relacion entre las entidades de la ontologıa de dominio implicadasen el ejemplo

En la figura 21 la clase Enfermera hereda de la clase Persona la propiedad lo-calizada en, que es una instancia que va a tener como dominios Antena, Rfid yPersona y como rangos Localizacion, Antena y Rfid respectivamente. Medianteesta propiedad se relacionan las entidades implicadas en el ejemplo.

35

Page 36: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

La propiedad localizada en es transitiva. La transitividad se cumple siempreque un elemento se relaciona con otro y este ultimo con un tercero, entonces elprimero se relaciona con el tercero. En nuestro ejemplo tenemos que Enfermera,Rfid y Antena tienen la propiedad localizada en.

Si una persona esta localizada con un lector Rfid, este lector es leido por unaantena y la antena esta en una localizacion concreta podemos asegurar que dichapersona esta en dicha localizacion.

Como hemos visto OCP2 no notifica lo que se infiere de forma axiomatica, real-mente, la informacion se recoge, pero no se hace explıcita al menos que se especi-fique directamente.

8.5. Ficheros de manifiesto de los bundles del ejemplo

Como sabemos las unidades (o programas) instalables en OSGi se llaman bundleso modulos. Un bundle es un proyecto Java empaquetado en un fichero JAR, quecontiene las clases en java de la interfaz del servicio que registrar en OSGi, suimplementacion, y un poco de meta-informacion en un fichero de manifiesto quecontiene atributos especiales para el sistema OSGi.

Los bundles estan aislados unos de otros y, en principio, no pueden ver o usarcodigo de otros bundles. Los bundles pueden exportar sus paquetes Java mediantela propiedad package-export dentro de su fichero de manifiesto. Exportandolos paquetes un bundle permite acceso a las clases del paquete exportado a otrosbundles. Para que un bundle use los paquetes exportados de otro debe indicarloexplicitamente mediante la propiedad package-import. De esta forma se creauna dependencia estatica entre los bundles que exportan paquetes y los que losimportan.

En nuestro ejemplo los bundles productor y consumidor deberan importar elpaquete donde se encuentra el servicio contextservice en su fichero de manifiestopara poder usar la API que OCP2 pone a su disposicion. A su vez el bundle OCP2debera exportarlo. Podemos ver 3 ejemplos en las siguientes figuras:

Las figuras 22 y 23 corresponde a los ficheros de manifiesto de los bundles pro-ductor y consumidor respectivamente, la figura 24 corresponde al fichero de man-ifiesto del bundle OCP2.

36

Page 37: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Figura 22: Contenido del fichero de manifiesto del bundle productor del ejemplo

Figura 23: Contenido del fichero de manifiesto del bundle consumer del ejemplo

Figura 24: Contenido del fichero de manifiesto del bundle OCP2

Como vemos en las figuras anteriores podemos ver algunas de las propiedadesque deben de contener cualquier fichero de manifiesto. Las propiedades mas im-portantes son:

· Bundle-name: Identifica al bundle con un nombre dentro de OSGi.

37

Page 38: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

· Bundle-activator: Notifica a OSGi cual es la clase “Activator” para lanzar elbundle, es como un “main”.

· Import-Package: Los paquetes que importa de otros bundles.

· Export-Package: Los paquetes que pone a disposicion de otros bundles.

38

Page 39: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

9. Conclusiones

En este documento se ha descrito el middleware de gestion de contexto OCP2dentro del framework OSGi donde han expuesto sus principales caracterısticas.

Antes de instalar el bundle en Knopflerfish proponemos el editor de ontologıasProtege para la creacion de nuestra ontologıa de dominio y explicamos comoimportar desde el la ontologıa base de OCP2.

Tambien se explica como configurar el fichero “config.props” que contiene la con-figuracion del servicio OCP2 para un modelo de contexto concreto. Mostramosmediante una tabla las propiedades que contiene el fichero y el significado de cadauna de ellas.

Presentamos los bundles principales que forman parte del sistema OCP2, y elorden en el cual tienen que ser instalados en Knopflerfish.

Se muestra la API de OCP2 que los demas bundles podran utilizar gracias alservicio “ContextService” que OCP2 registra en OSGi.

Vemos tambien una de las maneras que tenemos para poder depurar nuestrosbundles desde el IDE NetBeans.

Dentro del ambito de OCP2 definimos los productores de contexto y los consum-idores de contexto. Exponemos las interfaces ContextProducer y ContextCon-sumer que deberan implementar respectivamente. Se muestra un metodo de ac-ceso a los servicios que registran los bundles en OSGi, el metodo whiteboard quesimplifica la implementacion de los bundles clientes del servicio OCP2.

Por ultimo se describen en detalle dos bundles, un bundle productor de contextoy otro consumidor como ejemplo de uso de OCP2.

Se explica el archivo de manifiesto que debe de tener todo bundle en OSGi y losparametros mas importantes del mismo. Como ejemplo se muestran los ficherosde manifiesto de los bundles Productor, Consumidor y del bundle OCP2.

39

Page 40: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

10. Anexo A. Codigo del bundle Productor

package productorCardinea2 ;

import org . o s g i . framework . BundleActivator ;import org . o s g i . framework . BundleContext ;import org . o s g i . framework . Constants ;

/∗∗∗∗ @author Ramon Garc ıa Vigueras∗/

public c lass Act ivator implements BundleActivator{

public stat ic BundleContext bc = null ;private stat ic ProductorCardinea2 pac i ente = null ;

public void s t a r t ( BundleContext bc ) throws Exception {Act ivator . bc = bc ;pac i ente = new ProductorCardinea2 ( ”Nuevo Productor ” , ” Productor ” , ”1” , bc ) ;pac i ente . s t a r t ( ) ;System . out . p r i n t l n ( bc . getBundle ( ) . getHeaders ( ) . get ( Constants .BUNDLE NAME) + ”

comenzado . ” ) ;}

public void stop ( BundleContext bc ) throws Exception {pac i ente . stop ( ) ;pac i ente = null ;

Act ivator . bc = null ;

System . out . p r i n t l n ( bc . getBundle ( ) . getHeaders ( ) . get ( Constants .BUNDLE NAME) + ”terminado . ” ) ;

}}

package productorCardinea2 ;

import java . u t i l . Hashtable ;import java . u t i l . Random ;import java . u t i l . l ogg ing . Level ;import java . u t i l . l ogg ing . Logger ;import ocp . s e r v i c e . ContextEntityItems ;import ocp . s e r v i c e . ContextItem ;import ocp . s e r v i c e . ContextItemRelation ;import ocp . s e r v i c e . ContextProducer ;import ocp . s e r v i c e . ContextServ ice ;import org . o s g i . framework . BundleContext ;import org . o s g i . framework . S e r v i c e R e g i s t r a t i o n ;

/∗∗∗∗ @author Ramon Garc ıa Vigueras∗/

public c lass ProductorCardinea2 implements ContextProducer , Runnable{private Thread thread ;private ContextServ ice cs ;private S e r v i c e R e g i s t r a t i o n s r ;stat ic BundleContext bc ;private St r ing id ;private St r ing en t i t yC l a s s ;private St r ing en t i t y Id ;private boolean running = fa l se ;private int i = 0 ;private f loat temperatura = 20 ;private f loat s u p e r f i c i e = 30 ;

private stat ic St r ing l o c a l i z a c i o n e s [ ] = {”UCI” ,” Sala Operaciones ” ,” Restaurante ”

} ;

private stat ic St r ing d e s c r i p c i o n e s [ ] = {” Sala de cuidados i n t e n s i v o s ” ,” Sala de operac ione s e i n t e r v e n c i o n e s ” ,” Restaurante ”

} ;

private stat ic St r ing d i r e c c i one sLoc [ ] = {” Planta Baja” ,”Primera Planta ” ,” Planta Baja”

40

Page 41: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

} ;

private stat ic St r ing nombres [ ] = {”Maria” ,”Monica” ,”Eva” ,” Jesus ” ,”Adrian” ,”Pedro” ,” Cata l ina ” ,” Lucia ” ,”Noa” ,” Sonia ”

} ;

private stat ic St r ing a p e l l i d o s [ ] = {” Perez Sanchez” ,” Garcia Lopez” ,”Zapata Fernandez” ,” Agui lar L lo rente ” ,”Gomez Serrano ” ,” Vigueras Garcia ” ,”Jimenez Torregosa ” ,”Murcia Espin” ,”Hernandez Sosa” ,” Ruiperez Gi l ”

} ;

private stat ic St r ing t e l e f o n o s [ ] = {”654789214” ,”675349212” ,”612347382” ,”687560483” ,”622334092” ,”638902348” ,”699943243” ,”643212234” ,”687778843” ,”688994533”

} ;

private stat ic St r ing dni [ ] = {”23445621D” ,”14326873G” ,”87243523V” ,”78132443D” ,”43523489D” ,”24324353F” ,”43543523X” ,”24351234D” ,”43532453D” ,”89078734W”

} ;

private stat ic St r ing d i r e c c i o n e s [ ] = {”C/ Santiago de c h i l e n15” ,”C/ Soto de l mayor n12” ,”C/ Antonio Machado n34” ,”C/ Mayor n23” ,”C/ Soto de l Real n9” ,”C/ Franc i sco Rabal n11” ,”C/ Fuente de l a esperanza n89” ,” Plaza Justa n21” ,” Plaza de l o s c i s n e s n178” ,”C/ Mar Menor n54”

} ;

/∗∗∗ C o n s t r u c t o r∗ @param i d Source i d∗ @param e n t i t y C l a s s E n t i t y∗ @param e n t i t y I d E n t i t y ID∗/

ProductorCardinea2 ( St r ing id , S t r ing ent i tyC la s s , S t r ing ent i ty Id , BundleContext bc ) {this . id = id ;this . e n t i t yC l a s s = en t i t yC l a s s ;this . e n t i t y Id = en t i t y Id ;this . bc = bc ;thread = new Thread ( this ) ;Hashtable props = new Hashtable ( ) ;props . put ( ” id ” , id ) ;s r = bc . r e g i s t e r S e r v i c e ( ContextProducer . class . getName ( ) , this , props ) ;

}

41

Page 42: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

public St r ing get Id ( ) {return id ;

}

public void a c t i v a t e ( ContextServ ice cs ) {this . c s = cs ;

}

public void deac t i va t e ( ) {cs = null ;

}

public void run ( ) {

Random r = new Random() ;

wa i tForServ i ceAct ive ( ) ;en t i tyCrea t i on ( ) ;

while ( running ){waitForServ i ceAct ive ( ) ;

for ( int i n d i c e =0; ind i ce <10; i n d i c e++){

St r ing s Id = In t ege r . t oS t r ing ( i n d i c e ) ;

// Generamos un numero a l e a t o r i o e n t r e 0 y 2 que s e r a e l i d de l a s antenasint x = ( int ) ( ( r . nextDouble ( ) ∗ 10 . 0 ) %3) ;S t r ing sIdAntena = Int ege r . t oS t r ing (x ) ;

updateAntenaEvent ( sIdAntena , s Id ) ;// p r i n t G e n e r a r S e n a l ( sIdAntena , s I d ) ;

}

try {Thread . s l e e p (4000) ;

} catch ( Inter ruptedExcept ion ex ) {}

}}

/∗∗∗ Act i va e l t h r e a d∗/

public void s t a r t ( ) {running = true ;this . thread . s t a r t ( ) ;

}

/∗∗∗ Para e l t h r e a d y q u i t a e l s e r v i c i o Contex tProducer∗/

public void stop ( ) {running = fa l se ;try {

thread . j o i n ( ) ;} catch ( Inter ruptedExcept ion ex ) {

Logger . getLogger ( ProductorCardinea2 . class . getName ( ) ) . l og ( Level .SEVERE, null , ex ) ;}s r . u n r e g i s t e r ( ) ;

}

/∗∗∗ Crea l a s e n t i d a d e s n e c e s a r i a s∗/

public void ent i tyCrea t i on ( ) {

// Creamos t o d a s l a s l o c a l i z a c i o n e sContextEntityItems contextItems ;

for ( int i =0; i <3; i++){St r ing s I d L o c a l i z a c i o n = In t ege r . t oS t r i ng ( i ) ;contextItems = new ContextEntityItems ( ” Loca l i z a c i on ” , s I d L o c a l i z a c i o n ) ;contextItems . addContextItem (new ContextItem ( ” temperatura ” , temperatura ) ) ;contextItems . addContextItem (new ContextItem ( ”nombre” , l o c a l i z a c i o n e s [ i ] ) ) ;contextItems . addContextItem (new ContextItem ( ” d e s c r i p c i o n ” , d e s c r i p c i o n e s [ i ] ) )

;contextItems . addContextItem (new ContextItem ( ” d i r e c c i o n ” , d i r e c c i one sLoc [ i ] ) ) ;contextItems . addContextItem (new ContextItem ( ” s u p e r f i c i e ” , s u p e r f i c i e ) ) ;cs . setContextItems ( contextItems ) ;

contextItems = new ContextEntityItems ( ”Antena” , s I d L o c a l i z a c i o n ) ;contextItems . addContextItem (new ContextItem ( ” id ” , s I d L o c a l i z a c i o n ) ) ;

42

Page 43: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

contextItems . addContextItem (new ContextItemRelat ion ( ”l o c a l i z a d a e n ” , ” Loca l i z a c i on ” , s I d L o c a l i z a c i o n ) ) ;

cs . setContextItems ( contextItems ) ;

}

// Creamos l a s Enfermeras con sus r e s p e c t i v o s Rf idfor ( int j=0 ; j <10; j++){

St r ing s IdRf id = In t ege r . t oS t r ing ( j ) ;

contextItems = new ContextEntityItems ( ” Rfid ” , s IdRf id ) ;contextItems . addContextItem (new ContextItemRelat ion ( ” l o c a l i z a d a e n ” , ”Antena” ,

”1” ) ) ;cs . setContextItems ( contextItems ) ;

contextItems = new ContextEntityItems ( ”Rol” , ”1” ) ;cs . setContextItems ( contextItems ) ;

contextItems = new ContextEntityItems ( ”Enfermera” , s IdRf id ) ;contextItems . addContextItem (new ContextItemRelat ion ( ” t i eneRo l e s ” , ”Rol” , ”1” ) ) ;contextItems . addContextItem (new ContextItemRelat ion ( ” l o c a l i z a d a e n ” , ” Rfid ” ,

s IdRf id ) ) ;contextItems . addContextItem (new ContextItem ( ”nombre” , nombres [ j ] ) ) ;contextItems . addContextItem (new ContextItem ( ” a p e l l i d o s ” , a p e l l i d o s [ j ] ) ) ;contextItems . addContextItem (new ContextItem ( ” t e l e f o n o ” , t e l e f o n o s [ j ] ) ) ;contextItems . addContextItem (new ContextItem ( ” dni ” , dni [ j ] ) ) ;contextItems . addContextItem (new ContextItem ( ” d i r e c c i o n ” , d i r e c c i o n e s [ j ] ) ) ;contextItems . addContextItem (new ContextItem ( ” j e f a ” , true ) ) ;cs . setContextItems ( contextItems ) ;

}

}

public ContextServ ice wa i tForServ i ceAct ive ( ) {int i = 0 ;while ( cs == null && i < 20) {

try {System . out . p r i n t l n ( id + ” : S e r v i c i o inoperat ivo , esperando recuperac ion ”

) ;Thread . s l e e p (1000) ;

} catch ( Inter ruptedExcept ion ex ) {System . out . p r i n t l n ( id + ” : S e r v i c i o recuperado ” ) ;

}}return cs ;

}

private synchronized void pr intGenerarSe na l ( S t r ing sIdAntena , S t r ing s Id ) {System . out . p r i n t l n ( ”La antena ” + sIdAntena + ” Ha detectado e l Rfid ” + sId ) ;

}

private void updateAntenaEvent ( St r ing sIdAntena , S t r ing s Id ) {cs . setContextItemRelat ion ( ” Rfid ” , sId , ” l o c a l i z a d a e n ” , ”Antena” , sIdAntena ) ;cs . setContextItemRelat ion ( ”Antena” , sIdAntena , ” l o c a l i z a d a e n ” , ” Loca l i z a c i on ” ,

sIdAntena ) ;cs . setContextItemRelat ion ( ”Enfermera” , sId , ” l o c a l i z a d a e n ” , ” Rfid ” , s Id ) ;

}

}

43

Page 44: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

11. Anexo B. Codigo del bundle Consumidorpackage consumidorCardinea2 ;

import org . o s g i . framework . BundleActivator ;import org . o s g i . framework . BundleContext ;import org . o s g i . framework . Constants ;

/∗∗∗∗ @author Ramon Garc ıa Vigueras∗/

public c lass Act ivator implements BundleActivator{

private stat ic BundleContext bc = null ;private stat ic ConsumidorCardinea2 consCard = null ;

public void s t a r t ( BundleContext bc ) throws Exception {Act ivator . bc = bc ;consCard = new ConsumidorCardinea2 ( ”Consumidor Cardinea ” , bc ) ;consCard . s t a r t ( ) ;System . out . p r i n t l n ( bc . getBundle ( ) . getHeaders ( ) . get ( Constants .BUNDLE NAME) + ”

comenzado . ” ) ;}

public void stop ( BundleContext bc ) throws Exception {consCard . stop ( ) ;consCard = null ;

Act ivator . bc = null ;

System . out . p r i n t l n ( bc . getBundle ( ) . getHeaders ( ) . get ( Constants .BUNDLE NAME) + ”terminado . ” ) ;

}}

package consumidorCardinea2 ;

import java . u t i l . Hashtable ;import java . u t i l . l ogg ing . Level ;import java . u t i l . l ogg ing . Logger ;import ocp . s e r v i c e . ContextConsumer ;import ocp . s e r v i c e . ContextEntityItems ;import ocp . s e r v i c e . ContextItemRelation ;import ocp . s e r v i c e . ContextServ ice ;import org . o s g i . framework . BundleContext ;import org . o s g i . framework . S e r v i c e R e g i s t r a t i o n ;

/∗∗∗∗ @author Ramon Garc ıa Vigueras∗/

public c lass ConsumidorCardinea2 implements ContextConsumer , Runnable {

private Thread thread ;private ContextServ ice cs ;private St r ing id ;private S e r v i c e R e g i s t r a t i o n s r ;private boolean running = fa l se ;private stat ic f ina l Object SCREEN MUTEX = new Object ( ) ;

/∗∗∗ C o n s t r u c t o r para e l consumidor c a r d i n e a∗ @param i d d e l consumidor∗ @param bc , o b j e t o Bund leContext para r e g i s t r a r e l s e r v i c i o en OSGi∗/

public ConsumidorCardinea2 ( St r ing id , BundleContext bc ) {this . id = id ;this . thread = new Thread ( this ) ;

// R e g i s t r a e l s e r v i c i o ContextConsumerHashtable props = new Hashtable ( ) ;props . put ( ” id ” , id ) ;s r = bc . r e g i s t e r S e r v i c e ( ContextConsumer . class . getName ( ) , this , props ) ;

}

public St r ing get Id ( ) {return id ;

}

/∗∗∗ Act i va e l t h r e a d

44

Page 45: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

∗/public void s t a r t ( ) {

running = true ;this . thread . s t a r t ( ) ;

}

/∗∗∗ Para e l t h r e a d y q u i t a e l r e g i s t r o d e l s e r v i c i o∗/

public void stop ( ) {running = fa l se ;try {

thread . j o i n ( ) ;} catch ( Inter ruptedExcept ion e ) {}id = null ;thread = null ;s r . u n r e g i s t e r ( ) ; // o p c i o n a l

}

public void a c t i v a t e ( ContextServ ice cs ) {System . out . p r i n t l n ( this . id + ” −− S e r v i c i o ac t i vo ” ) ;this . c s = cs ;

}

public void deac t i va t e ( ) {// En caso de que se d e s a c t i v e , ponemos e l Cs a n u l lSystem . out . p r i n t l n ( this . id + ” −− S e r v i c i o i n a c t i v o ” ) ;cs = null ;

}

public void notifyContextChange ( ContextEntityItems context ) {// Implementa i n t e r f a z ContextConsumer// Si hay un cambio en e l c o n t e x t o , l o imprime por p a n t a l l aSystem . out . p r i n t l n ( this . id + ” −− notifyContextChange : ” + context ) ;pr intContext ( context ) ;

}

public void notifyNewContext ( ContextEntityItems context ) {// Implementa i n t e r f a z ContextConsumer// Si hay un nuevo c o n t e x t o , l o imprime por p a n t a l l aSystem . out . p r i n t l n ( this . id + ” −− notifyNewContext : ” + context ) ;pr intContext ( context ) ;

}

/∗∗∗ H i l o d e l t h r e a d∗/

public void run ( ) {while ( running ) {

try {Thread . s l e e p (4000) ;

} catch ( Inter ruptedExcept ion ex ) {Logger . getLogger ( ConsumidorCardinea2 . class . getName ( ) ) . l og ( Level .SEVERE, null ,

ex ) ;}

// Si tenemos l a i n t e r f a z de s e r v i c i oi f ( wa i tForServ i ceAct ive ( ) != null ) {

// leemos l o s cambios p r o d u c i d o s en e l p r o d u c t o r de OCPcs . r e g i s t e r ( ”Enfermera” , this ) ;

}}

}

public ContextServ ice wa i tForServ i ceAct ive ( ) {int i = 0 ;while ( cs == null && i < 20) {

try {System . out . p r i n t l n ( id + ” : S e r v i c i o inoperat ivo , esperando recuperac ion ”

) ;Thread . s l e e p (1000) ;

} catch ( Inter ruptedExcept ion ex ) {System . out . p r i n t l n ( id + ” : S e r v i c i o recuperado ” ) ;

}}return cs ;

}

private void pr intContext ( ContextEntityItems context ) {synchronized (SCREEN MUTEX){

// Mostramos l o s cambios de l o c a l i z a c i o n por p a n t a l l aSystem . out . p r i n t l n ( ”La enfermera /o ” + cs . getContextItemStr ing ( ”Enfermera” ,

45

Page 46: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

context . ge tLoca l Id ( ) , ”nombre” ) ) ;ContextItemRelat ion c i r = cs . getContextItemRelat ion ( ”Enfermera” , context .

ge tLoca l Id ( ) , ” l o c a l i z a d a e n ” ) ;System . out . p r i n t l n ( c i r ) ;ContextItemRelat ion c i r R f i d = cs . getContextItemRelat ion ( ” Rfid ” , c i r .

getValueIdEnt i ty ( ) , ” l o c a l i z a d a e n ” ) ;ContextItemRelat ion cirA = cs . getContextItemRelat ion ( ”Antena” , c i r R f i d .

getValueIdEnt i ty ( ) , ” l o c a l i z a d a e n ” ) ;ContextEntityItems c e i = cs . getContextItems ( ” Loca l i z a c i on ” , c irA .

getValueIdEnt i ty ( ) ) ;System . out . p r i n t l n ( c e i . getContextItem ( ”nombre” ) ) ;System . out . p r i n t l n ( ) ;

}}

}

46

Page 47: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

12. Anexo C. Codigo OWL de la ontologıa base

de OCP2<?xml ve r s i on=” 1 .0 ”?><rd f :RDF

xmlns=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#”xmlns : rd f=” http ://www. w3 . org /1999/02/22− rdf−syntax−ns#”xmlns : p1=” http ://www. owl−o n t o l o g i e s . com/ a s s e r t . owl#”xmlns : owl=” http ://www. w3 . org /2002/07/ owl#”xmlns : xsd=” http ://www. w3 . org /2001/XMLSchema#”xmlns : r d f s=” http ://www. w3 . org /2000/01/ rdf−schema#”

xml : base=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl”><owl : Ontology rd f : about=””/><owl : Class rd f : ID=” ContextEntity ”/><owl : Funct ionalProperty rd f : ID=” t s ”>

<rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : domain rd f : r e s ou r c e=”#ContextEntity ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#dateTime”/><r d f s : comment rd f : datatype=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”>TimeStamp</r d f s : comment>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=” oid ”>

<r d f s : comment rd f : datatype=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”>Copia de l id de l objeto </r d f s : comment><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><r d f s : domain rd f : r e s ou r c e=”#ContextEntity ”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=” seq ”>

<r d f s : comment rd f : datatype=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”>Numero de ve r s i on . Entero c o r r e l a t i v o que empieza en 1</ r d f s : comment><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#in t ”/><r d f s : domain rd f : r e s ou r c e=”#ContextEntity ”/><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/>

</owl : FunctionalProperty></rd f :RDF>

<!−− Created with Protege ( with OWL Plugin 3 . 3 . 1 , Build 430) http : // p r o t e g e . s t a n f o r d . edu −−>

47

Page 48: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

13. Anexo D. Codigo OWL de la ontologıa de

dominio del proyecto Cardinea<?xml ve r s i on=” 1 .0 ”?><rd f :RDF

xmlns : xsp=” http ://www. owl−o n t o l o g i e s . com/2005/08/07/ xsp . owl#”xmlns : swrlb=” http ://www. w3 . org /2003/11/ swrlb#”xmlns=” http ://www.um. es /Ontology/ onto log iaCard inea . owl#”xmlns : swr l=” http ://www. w3 . org /2003/11/ swr l#”xmlns : protege=” http :// protege . s tan fo rd . edu/ p lug in s /owl/ protege#”xmlns : rd f=” http ://www. w3 . org /1999/02/22− rdf−syntax−ns#”xmlns : xsd=” http ://www. w3 . org /2001/XMLSchema#”xmlns : r d f s=” http ://www. w3 . org /2000/01/ rdf−schema#”xmlns : owl=” http ://www. w3 . org /2002/07/ owl#”xmlns : ocp=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#”

xml : base=” http ://www.um. es /Ontology/ onto log iaCard inea . owl”><owl : Ontology rd f : about=””>

<owl : imports rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl”/></owl : Ontology><owl : Class rd f : ID=”TipoMedicamento”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#ClassAtom”/><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#Bu i l t i n ”/><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#AtomList”/><owl : Class rd f : ID=”Antena”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#DataRangeAtom”/><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#SameIndividualAtom”/><owl : Class rd f : ID=”Tratamiento”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=”Actuador”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#Imp”/><owl : Class rd f : ID=”Medicamento”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=” P o l i t i c a s ”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=” HabitacionExpuestaRadiacion ”>

<r d f s : subClassOf><owl : Class rd f : ID=” Loca l i z a c i on ”/>

</r d f s : subClassOf></owl : Class><owl : Class rd f : ID=” Farmaceutico ”>

<r d f s : subClassOf><owl : Class rd f : ID=” Per sona lHosp i t a l a r i o ”/>

</r d f s : subClassOf></owl : Class><owl : Class rd f : ID=” SensorPresenc ia ”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=”Doctor”>

<r d f s : subClassOf><owl : Class rd f : about=”#Per sona lHosp i t a l a r i o ”/>

</r d f s : subClassOf></owl : Class><owl : Class rd f : about=”#Per sona lHosp i t a l a r i o ”>

<r d f s : subClassOf><owl : Class rd f : ID=”Persona”/>

</r d f s : subClassOf></owl : Class><owl : Class rd f : ID=” D i spo s i t i v o ”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#Var iab le ”/><owl : Class rd f : ID=” Recepc ion i s ta ”>

<r d f s : subClassOf rd f : r e sou r c e=”#Per sona lHosp i t a l a r i o ”/></owl : Class><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#BuiltinAtom”/><owl : Class rd f : ID=”Enfermera”>

<r d f s : subClassOf rd f : r e sou r c e=”#Per sona lHosp i t a l a r i o ”/></owl : Class><owl : Class rd f : ID=”Llamada”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=” Pre s c r i p c i on ”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class>

48

Page 49: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

<owl : Class rd f : ID=” Administrador ”><r d f s : subClassOf rd f : r e sou r c e=”#Per sona lHosp i t a l a r i o ”/>

</owl : Class><owl : Class rd f : ID=”Rol”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=” Rfid ”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=” Paciente ”>

<r d f s : subClassOf><owl : Class rd f : about=”#Persona”/>

</r d f s : subClassOf></owl : Class><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#DatavaluedPropertyAtom”/><owl : Class rd f : ID=”Cama”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=”AplicacionesSW ”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=”Alarma”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=” Persona lNoSani tar io ”>

<r d f s : subClassOf><owl : Class rd f : about=”#Persona”/>

</r d f s : subClassOf></owl : Class><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#Di f f e r ent Ind iv idua l sAtom ”/><owl : Class rd f : about=”#Persona”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : about=”#Loca l i z a c i on ”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=” H i s t o r i a l C l i n i c o ”>

<r d f s : subClassOf rd f : r e sou r c e=” http ://www.um. es /Ontology/ocp2 . 0 . 1 . owl#ContextEntity ”/></owl : Class><owl : Class rd f : ID=” Habitac ionPac iente ”>

<r d f s : subClassOf rd f : r e sou r c e=”#Loca l i z a c i on ”/></owl : Class><owl : Class rd f : ID=” Vi s i t an t e ”>

<r d f s : subClassOf rd f : r e sou r c e=”#Persona lNoSani tar io ”/></owl : Class><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#Atom”/><owl : Class rd f : about=” http ://www. w3 . org /2003/11/ swr l#IndividualPropertyAtom ”/><owl : ObjectProperty rd f : about=” http ://www. w3 . org /2003/11/ swr l#b u i l t i n ”/><owl : ObjectProperty rd f : ID=”medicamento”>

<r d f s : range rd f : r e sou r c e=”#Medicamento”/><r d f s : domain rd f : r e s ou r c e=”#Tratamiento”/>

</owl : ObjectProperty><owl : ObjectProperty rd f : ID=” hab i tac ion ”>

<r d f s : range rd f : r e sou r c e=”#Habitac ionPac iente ”/><r d f s : domain rd f : r e s ou r c e=”#Paciente ”/>

</owl : ObjectProperty><owl : ObjectProperty rd f : ID=” h i s t o r i a l ”>

<r d f s : range rd f : r e sou r c e=”#H i s t o r i a l C l i n i c o ”/><r d f s : domain rd f : r e s ou r c e=”#Paciente ”/>

</owl : ObjectProperty><owl : ObjectProperty rd f : about=” http ://www. w3 . org /2003/11/ swr l#argument1”/><owl : ObjectProperty rd f : ID=” t i eneRo l e s ”>

<r d f s : range rd f : r e sou r c e=”#Rol”/><r d f s : domain rd f : r e s ou r c e=”#Persona”/>

</owl : ObjectProperty><owl : ObjectProperty rd f : ID=” p r e s c r i p c i o n e s ”>

<r d f s : range rd f : r e sou r c e=”#Pre s c r i p c i on ”/><r d f s : domain>

<owl : Class><owl : unionOf rd f : parseType=” C o l l e c t i o n ”>

<owl : Class rd f : about=”#Doctor”/><owl : Class rd f : about=”#Paciente ”/>

</owl : unionOf></owl : Class>

</r d f s : domain></owl : ObjectProperty><owl : ObjectProperty rd f : ID=”cama”>

<r d f s : range rd f : r e sou r c e=”#Cama”/><r d f s : domain rd f : r e s ou r c e=”#Paciente ”/>

</owl : ObjectProperty><owl : ObjectProperty rd f : about=” http ://www. w3 . org /2003/11/ swr l#dataRange”/><owl : ObjectProperty rd f : ID=”tipoMedicamento”>

<r d f s : domain rd f : r e s ou r c e=”#Medicamento”/><r d f s : range rd f : r e sou r c e=”#TipoMedicamento”/>

</owl : ObjectProperty><owl : ObjectProperty rd f : about=” http ://www. w3 . org /2003/11/ swr l#arguments”/>

49

Page 50: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

<owl : ObjectProperty rd f : about=” http ://www. w3 . org /2003/11/ swr l#body”/><owl : ObjectProperty rd f : about=” http ://www. w3 . org /2003/11/ swr l#head”/><owl : ObjectProperty rd f : ID=”medicamentos”>

<r d f s : range rd f : r e sou r c e=”#TipoMedicamento”/><r d f s : domain rd f : r e s ou r c e=”#Tratamiento”/>

</owl : ObjectProperty><owl : ObjectProperty rd f : ID=” incompat ib l e s ”>

<r d f s : domain rd f : r e s ou r c e=”#H i s t o r i a l C l i n i c o ”/><r d f s : range rd f : r e sou r c e=”#TipoMedicamento”/>

</owl : ObjectProperty><owl : ObjectProperty rd f : about=” http ://www. w3 . org /2003/11/ swr l#c l a s s P r e d i c a t e ”/><owl : ObjectProperty rd f : ID=” d i spo s i t i v oAsoc i ado ”>

<r d f s : domain rd f : r e s ou r c e=”#AplicacionesSW ”/><r d f s : range rd f : r e sou r c e=”#Di spo s i t i v o ”/>

</owl : ObjectProperty><owl : ObjectProperty rd f : ID=” r e c e t a s ”>

<r d f s : domain rd f : r e s ou r c e=”#Pre s c r i p c i on ”/><r d f s : range rd f : r e sou r c e=”#Tratamiento”/>

</owl : ObjectProperty><owl : ObjectProperty rd f : about=” http ://www. w3 . org /2003/11/ swr l#proper tyPred i cate ”/><owl : ObjectProperty rd f : about=” http ://www. w3 . org /2003/11/ swr l#argument2”/><owl : DatatypeProperty rd f : ID=” estado ”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><r d f s : domain>

<owl : Class><owl : unionOf rd f : parseType=” C o l l e c t i o n ”>

<owl : Class rd f : about=”#Pre s c r i p c i on ”/><owl : Class rd f : about=”#Medicamento”/><owl : Class rd f : about=”#Tratamiento”/>

</owl : unionOf></owl : Class>

</r d f s : domain></owl : DatatypeProperty><owl : DatatypeProperty rd f : ID=” j e f a ”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#boolean ”/><r d f s : domain rd f : r e s ou r c e=”#Enfermera”/>

</owl : DatatypeProperty><owl : DatatypeProperty rd f : ID=” l i b r e ”>

<r d f s : domain rd f : r e s ou r c e=”#Cama”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#boolean ”/>

</owl : DatatypeProperty><owl : DatatypeProperty rd f : ID=” t i e m p o i n i c i a l ”>

<r d f s : domain><owl : Class>

<owl : unionOf rd f : parseType=” C o l l e c t i o n ”><owl : Class rd f : about=”#Doctor”/><owl : Class rd f : about=”#Enfermera”/>

</owl : unionOf></owl : Class>

</r d f s : domain><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#in t ”/>

</owl : DatatypeProperty><owl : DatatypeProperty rd f : ID=” d e s c r i p c i o n ”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><r d f s : domain>

<owl : Class><owl : unionOf rd f : parseType=” C o l l e c t i o n ”>

<owl : Class rd f : about=”#Loca l i z a c i on ”/><owl : Class rd f : about=”#P o l i t i c a s ”/>

</owl : unionOf></owl : Class>

</r d f s : domain></owl : DatatypeProperty><owl : DatatypeProperty rd f : ID=” d i r e c c i o n ”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><r d f s : domain>

<owl : Class><owl : unionOf rd f : parseType=” C o l l e c t i o n ”>

<owl : Class rd f : about=”#Loca l i z a c i on ”/><owl : Class rd f : about=”#Persona”/>

</owl : unionOf></owl : Class>

</r d f s : domain></owl : DatatypeProperty><owl : DatatypeProperty rd f : ID=”tiempo acumulado”>

<r d f s : domain><owl : Class>

<owl : unionOf rd f : parseType=” C o l l e c t i o n ”><owl : Class rd f : about=”#Doctor”/><owl : Class rd f : about=”#Enfermera”/>

</owl : unionOf></owl : Class>

</r d f s : domain><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#in t ”/>

</owl : DatatypeProperty><owl : DatatypeProperty rd f : ID=” ac t i vo ”>

50

Page 51: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#boolean ”/><r d f s : domain>

<owl : Class><owl : unionOf rd f : parseType=” C o l l e c t i o n ”>

<owl : Class rd f : about=”#SensorPresenc ia ”/><owl : Class rd f : about=”#Actuador”/>

</owl : unionOf></owl : Class>

</r d f s : domain></owl : DatatypeProperty><owl : DatatypeProperty rd f : ID=” t e l e f o n o ”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><r d f s : domain rd f : r e s ou r c e=”#Persona”/>

</owl : DatatypeProperty><owl : DatatypeProperty rd f : ID=” e n r i e s g o ”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#in t ”/><r d f s : domain>

<owl : Class><owl : unionOf rd f : parseType=” C o l l e c t i o n ”>

<owl : Class rd f : about=”#Doctor”/><owl : Class rd f : about=”#Enfermera”/>

</owl : unionOf></owl : Class>

</r d f s : domain></owl : DatatypeProperty><owl : DatatypeProperty rd f : ID=” s u p e r f i c i e ”>

<r d f s : domain rd f : r e s ou r c e=”#Loca l i z a c i on ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#f l o a t ”/>

</owl : DatatypeProperty><owl : Trans i t iveProper ty rd f : ID=” l o c a l i z a d a e n ”>

<rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#ObjectProperty ”/><r d f s : domain>

<owl : Class><owl : unionOf rd f : parseType=” C o l l e c t i o n ”>

<owl : Class rd f : about=”#Antena”/><owl : Class rd f : about=”#Rfid ”/><owl : Class rd f : about=”#Persona”/><owl : Class rd f : about=”#SensorPresenc ia ”/><owl : Class rd f : about=”#Actuador”/>

</owl : unionOf></owl : Class>

</r d f s : domain><r d f s : range>

<owl : Class><owl : unionOf rd f : parseType=” C o l l e c t i o n ”>

<owl : Class rd f : about=”#Loca l i z a c i on ”/><owl : Class rd f : about=”#Antena”/><owl : Class rd f : about=”#Rfid ”/>

</owl : unionOf></owl : Class>

</r d f s : range></owl : Trans i t iveProperty><owl : Funct ionalProperty rd f : ID=” f r e c u e n c i a ”>

<rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><r d f s : domain rd f : r e s ou r c e=”#Tratamiento”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=” t ipo ”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : domain rd f : r e s ou r c e=”#Di spo s i t i v o ”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=” id ”>

<r d f s : domain><owl : Class>

<owl : unionOf rd f : parseType=” C o l l e c t i o n ”><owl : Class rd f : about=”#Di spo s i t i v o ”/><owl : Class rd f : about=”#Llamada”/><owl : Class rd f : about=”#P o l i t i c a s ”/><owl : Class rd f : about=”#AplicacionesSW ”/><owl : Class rd f : about=”#Antena”/><owl : Class rd f : about=”#Rfid ”/>

</owl : unionOf></owl : Class>

</r d f s : domain><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=” fechaNacimiento ”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><r d f s : domain rd f : r e s ou r c e=”#Paciente ”/><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=” dni ”>

<rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/>

51

Page 52: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

<r d f s : domain rd f : r e s ou r c e=”#Persona”/></owl : Funct ionalProperty><owl : Funct ionalProperty rd f : ID=” temperatura ”>

<rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : domain rd f : r e s ou r c e=”#Loca l i z a c i on ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#f l o a t ”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=” fechaFin ”>

<rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><r d f s : domain rd f : r e s ou r c e=”#Tratamiento”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=”nombre”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><r d f s : domain>

<owl : Class><owl : unionOf rd f : parseType=” C o l l e c t i o n ”>

<owl : Class rd f : about=”#Di spo s i t i v o ”/><owl : Class rd f : about=”#Loca l i z a c i on ”/><owl : Class rd f : about=”#Persona”/><owl : Class rd f : about=”#AplicacionesSW ”/><owl : Class rd f : about=”#Alarma”/>

</owl : unionOf></owl : Class>

</r d f s : domain><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=” d o s i s ”>

<r d f s : domain rd f : r e s ou r c e=”#Tratamiento”/><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=”numHabitacion”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><r d f s : domain rd f : r e s ou r c e=”#Habitac ionPac iente ”/><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=” f e c h a I n i c i o ”>

<r d f s : domain rd f : r e s ou r c e=”#Tratamiento”/><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=” a p e l l i d o s ”>

<r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : domain rd f : r e s ou r c e=”#Persona”/>

</owl : FunctionalProperty><owl : Funct ionalProperty rd f : ID=”numCama”>

<r d f s : domain rd f : r e s ou r c e=”#Cama”/><rd f : type rd f : r e s ou r c e=” http ://www. w3 . org /2002/07/ owl#DatatypeProperty ”/><r d f s : range rd f : r e sou r c e=” http ://www. w3 . org /2001/XMLSchema#s t r i n g ”/>

</owl : FunctionalProperty></rd f :RDF>

<!−− Created with Protege ( with OWL Plugin 3 . 3 . 1 , Build 430) http : // p r o t e g e . s t a n f o r d . edu −−>

52

Page 53: Manual de Usuario de OCP2: Open Context Platformants-webs.inf.um.es › ocp2 › downloads › docs › ManualUsuarioOCP2.pdf\classloader" de la m aquina virtual y de los servidores

UMU Manual de Usuario de OCP2

Referencias

[1] The OSGi Alliance. OSGi Service Platform. Core Specification Release 4, Version4,1,Abril 2007

[2] The OSGi Alliance. OSGi Service Platform. Service Compendium Release 4, Version4,1,Abril 2007

[3] Roberto Montero Miguel, [email protected] OSGI

[4] Paco Lopez Marmol (UMU) OCP2. Diseno e implementacion 2010.

53