Introducción
Hyperwave ha sido desarrollado en el IICM en Graz_ Comenzó con
el nombre Hyper_G y cambió a Hyperwave cuando
fue comercializado (Si lo recuerdo bien, fue en 1996)_
Hyperwave no es software gratuiro_ La versión actual, 4_1, está
disponible en www_hyperwave_com_ Se
puede solicitar gratuitamente una versión limitada (30 días)_
Hyperwave es un sistema de información similar a una base de
datos (HIS, Hyperwave Information Server _ Servidor
Hyperwave de Información)_ Su objetivo es el almacenamiento y
manipulación de documentos_ Un documento puede ser cualquier bloque
posible de datos que también puede ser almacenado en un archivo_ Cada
documento se acompaña por su registro de objeto_ El registro de objeto
contiene metadatos para el documento_ Los metadatos son una lista de
atributos que pueden ser extendidos por el usuario_ Ciertos atributos
siempre son fijados por el servidor Hyperwave, otros pueden ser
modificados por el usuario_ Un atributo es un par nombre/valor de la
forma nombre=valor_ El registro completo del objeto tiene tantos de
estos pares como guste el usuario_ El nombre de un atributo no tiene
porqué ser único, p_ ej_ un título puede aparecer varias veces en el
registro de un objeto_ Esto tiene sentido si se desea especificar un
título en diferentes idiomas_ En dicho caso existe la convención de
que cada valor de título esté precedido por la abreviatura de dos
letras del idioma, seguida por dos puntos, como p_ ej_ 'en:Title in
English' o 'es:Título en Español'_ Otros atributos tales como
descripciones o palabras clave son canditatos potenciales a esta
diferenciación_ También se pueden reemplazar las abreviaturas de
idioma por cualquier otra cadena siempre y cuando estén separadas
por los dos puntos del resto del valor del atributo_
Cada registro de objeto tiene una representación nativa como cadena
con cada par nombre/valor separado por una línea nueva_ La extensión
Hyperwave también conoce una segunda representación que consiste en
un array asociativo donde el nombre del atributo es la clave_ Los
valores de atributo multilingües en sí mismos forman otro array
asociativo donde la clave es la abreviatura del idioma_ Realmente
cualquier atributo múltiple forma una tabla asociativa donde la cadena
a la izquierda de los dos puntos en el valor de atributo es la clave_
(Esto no se ha implementado por completo_ Sólo los atributos
Title, Description y Keyword son tratados adecuadamente_)
Aparte de los documentos, todos los hiper_enlaces contenidos en un
documento son almacenados también como registros de objeto_ Cuando
el documento sea insertado en la base de datos, los hiper_enlaces
que haya en un documento serán borrados del mismo y almacenados
como objetos individuales_
El registro de objeto del enlace contiene información acerca
de dónde comienza y dónde termina_
Para recuperar el documento original se deberá recuperar el
documento sin los enlaces y la lista de los mismos para reinsertarla
(Las funciones hw_pipedocument() y hw_gettext()
hacen esto para usted)_ La ventaja de separar los enlaces del
documento es obvia_ Una vez un documento al que apunta un enlace
cambia de nombre, el enlace puede modificarse fácilmente_ El documento
que contiene el enlace no se ve afectado_ Incluso se puede añadir
un enlace a un documento sin alterarlo_
Decir que hw_pipedocument() y hw_gettext()
hacen automáticamente la inserción de enlaces no es tan simple como suena_
Insertar los enlaces implica una cierta jerarquía en los documentos_ En
un servidor web esto viene dado por el sistema de archivos, pero el Hyperwave
tiene su propia jerarquía y los nombres no representan la posición de un
objeto en dicha jerarquía_ Por tanto, la creación de los enlaces precisa
primeramente de realizar un mapeado entre el espacio de nombres y la
jerarquía del Hyperwave y el espacio de nombres respectivo de una
jerarquía de web_ La diferencia fundamental entre Hyperwave y la web
es la distinción clara entre nombres y jerarquía que se da en el primero_
El nombre no contiene ninguna información sobre la posición del objeto
en la jerarquía_ En la web, el nombre también contiene la información
sobre la posición en la jerarquía del objeto_ Esto nos lleva a dos
posibles formas de mapeo_ O bien se reflejan la jerarquía del Hyperwave
y el nombre del objeto Hyperwave en el URL o sólo el nombre_
Para facilitar las cosas, se utiliza el segundo método_ El objeto
Hyperwave de nombre 'mi_objeto' es mapeado a 'http://host/mi_objeto' sin
importar dónde reside dentro de la jerarquía de Hyperwave_
Un objeto con el nombre 'padre/mi_objeto' podría ser el hijo de
'mi_objeto' en la jerarquía Hyperwave, aunque en el espacio de nombres
web aparezca justamente lo opuesto y el usuario pueda ser llevado a
confusión_ Esto sólo se puede evitar seleccionando nombres de objetos
razonables_
Hecha esta decisión surge un segundo problema_ ¿Cómo implicar al PHP?
el URL http://host/mi_objeto no llamará a ningún script PHP a no ser
que se le diga al servidor que lo transforme en p_ ej_
'http://host/script_php3/mi_objeto' y que el 'script_php3' luego
evalúe la variable $PATH_INFO y recupere el objeto con nombre 'mi_objeto'
del servidor Hyperwave_ Hay sólo un pequeño inconveniente que se
puede resolver fácilmente_ Cuando se reescribe cualquier URL no se
permite el acceso a ningún otro documento en el servidor web_ Un
script de PHP para buscar en el servidor Hyperwave sería imposible_
Por lo tanto se necesitará al menos una segunda regla de reescritura
para que excluya ciertos URL, como los que empiecen p_ ej_ por
http://host/Hyperwave_ Básicamente esto sería compartir un espacio
de nombres entre el servidor web y el servidor Hyperwave_
Los enlaces se insertan en los documentos basándose en el mecanismo
citado más arriba_
Se vuelve más complicado si el PHP no se está ejecutando como módulo
del servidor o como script CGI, sino que se ejecuta como aplicación,
p_ ej_ para volcar el contenido del servidor de Hyperwave a un CD_ROM_
En dicho caso tiene sentido mantener la jerarquía Hyperwave y mapearla
en el sistema de archivos_ Esto entra conflicto con los nombres de los
objetos si estos reflejan su propia jerarquía (p_ ej_ eligiendo nombres
que comienzan por '/')_ Por tanto, la '/' tendrá que ser reemplazada
por otro carácter, p_ ej_ '_' para continuar_
El protocolo de red para comunicarse con el servidor Hyperwave se
denomina HG_CSP (Hyper_G
Client/Server Protocol, Protocolo Hyper_G Cliente/Servidor)_ Está basado
en mensajes que inician ciertas acciones, p_ ej_ obtener el registro de
un objeto_ En versiones anteriores del Servidor Hyperwave se distribuyeron
dos clientes nativos (Harmony, Amadeus) para la comunicación con
el servidor_ Ambos desaparecieron cuando se comercializó el Hyperwave_
Para sustituírlo se proporcionó el llamado wavemaster_ El wavemaster es
como un conversor de protocolo de HTTP a HG_CSP_
La idea es realizar toda la administración de la base de datos y la
visualización de documentos con una interfaz web_ El wavemaster implementa
una serie de posicionadores para acciones que permiten personalizar la
interfaz_ Dicho conjunto de posicionadores se denomina el Lenguaje PLACE_
El PLACE no posee muchas de las características de
un lenguaje de programación real y las extensiones al mismo únicamente
alargan la lista de posicionadores_ Esto ha obligado al uso de JavaScript
que, en mi opinión, no hace la vida más fácil_
Añadir soporte de Hyperwave al PHP rellenaría el espacio
que deja la falta de un lenguaje de programación que permita
personalizar la interfaz_ El PHP implementa todos los mensajes
definidos en el HG_CSP pero además proporciona
comandos más poderosos, p_ ej_ recuperar documentos completos_
El Hyperwave tiene su propia terminología para dar nombre a ciertos
tipos de información_ Esta ha sido ampliamente extendida y anulada_
Casi todas las funciones operan en uno de los siguientes tipos de
datos_
ID de objeto: Un valor entero único paara cada objeto del
servidor Hyperwave_ También es uno de los atributos del registro
de objeto (ObjectID)_ Los ID de objeto se usan generalmente como
parámetros de entrada que especifican a un objeto_
registro de objeto: Una cadena con pares atributo_valor con la
forma atributo=valos_ Los pares están separados unos de otros
por un retorno de carro_ Un registro de objeto puede convertirse
fácilmente en una tabla (array) de objetos usando hw_object2array()_
Varias funciones devuelven registros de objeto_ Los nombres de
dichas funciones terminan en obj_
tabla de objetos: Una tabla asociativa con todos los atributos
de un objeto_ La clave es el nombre del atributo_ Si un atributo
aparece más de una vez en un registro de objeto será convertido
en otra tabla asociativa o indizada_ Los atributos que dependen
del idioma (como el título, claves o descripción) se convertirán
en una tabla asociativa con la abreviatura del idioma como clave_
El resto de los atributos múltiples crearán una tabla indizada_ Las
funciones de PHP nunca devuelven tablas de objetos_
hw_document: Este es un nuevo tipo de datos que almacena el documento
actual, p_ ej_ HTML, PDF, etc_ Está algo optimizado para documentos
HTML pero puede usarse para cualquier formato_
Varias funciones que devuelven una tabla de registros de objeto
también devuelven una tabla asociativa con información estadística
sobre los mismos_ La tabla es el último elemento del registro de
objeto_ La tabla estadística contiene los siguientes elementos:
- Hidden
Número de registros de objeto con el atributo PresentationHints
puesto a Hidden_
- CollectionHead
Número de registros de objeto con el atributo
PresentationHints puesto a CollectionHead_
- FullCollectionHead
Número de registros de objeto con el atributo
PresentationHints puesto a FullCollectionHead_
- CollectionHeadNr
Índice a una tabla de regitros de objeto con el
atributo PresentationHints puesto a CollectionHead_
- FullCollectionHeadNr
Índice a una tabla de regitros de objeto con el
atributo PresentationHints puesto a FullCollectionHead_
- Total
Total: Número de registros de objeto_
Integración con Apache
La extensión Hyperwave se utiliza mejor cuando el PHP se compila
como un módulo de Apache_ En tal caso el servidor Hyperwave subyacente
puede ser ocultado casi por completo de los usuarios si el Apache utiliza
su motor de re_escritura_ Las siguientes instrucciones explicarán esto_
Como el PHP con soporte Hyperwave incluído en el Apache se ha diseñado
para sustituir la solución nativa de Hyperwave basada en Wavemaster,
asumiré que el servidor Apache sólo sirve como interfaz web para
el Hyperwave_ Esto no es necesario, pero simplifica la configuración_
El concepto es bastante sencillo_ Primeramente necesita un script PHP
que evalúe la variable PATH_INFO y que trate su
valor como el nombre de un objeto Hyperwave_ Llamemos a este script
'Hyperwave'_ El URL http://nombre_servidor/Hyperwave/nombre_de_objeto
devolvería entonces el objeto Hyperwave llamado 'nombre_de_objeto'_
Dependiendo del tipo del objeto, así reaccionará el script_ Si es
una colección, probablemente devolverá un lista de hijos_ Si es un
documento devolverá el tipo MIME y el contenido_ Se puede mejorar
ligeramente si se usa el motor de re_escritura del Apache_ Desde el
punto de vista del usuario será más sencillo si el URL http://nombre_servidor/nombre de objeto
devuelve el objeto_ La regla de reescritura es muy sencilla:
Ahora todo URL apunta a un objeto en el servidor Hyperwave_ Esto
provoca un problema sencillo de resolver_ No hay forma de ejecutar otro
script, p_ ej_ para buscar, salvo el script 'Hyperwave'_ Esto se puede
solucionar con otra regla de reescritura como la siguiente:
Esta reservará el directorio
/usr/local/apache/htdocs/hw para
script adicionales y otros archivos_ Sólo hay que asegurarse que esta
regla se evalúa antes de la otra_ Sólo hay un pequeño inconveniente:
todos los objetos Hyperwave cuyo nombre comienza por 'hw/' serán ocultados_
así que asegúrese que no utiliza dichos nombres_ Si necesita más directorios,
p_ ej_ para imágenes, simplemente añada más reglas o sitúe los archivos en
un solo directorio_ Por último, no olvide conectar el motor de
re_escritura con
Mi experiencia me ha demostrado que necesitará los siguientes scripts:
para devolver el script en sí
para permitir las búsquedas
para identificarse
para ajustar su perfil
uno para cada función adicional como mostrar los atributos
del objeto, mostrar información sobre usuarios, mostrar el
estado del servidor, etc_