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 gratuito. La versi贸n actual, 5.5, est谩
disponible en http://www.hyperwave.com/. Se
puede solicitar gratuitamente una versi贸n limitada (30 d铆as).
Puede consultar tambi茅n la API de Hyperwave.
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.
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 $_ENV['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.
Una alternativa a utilizar "Rewrite Engine", es emplear la directiva de Apache
ErrorDocument. Sin embargo, las p谩ginas redirigidas
mediante ErrorDocument no pueden recibir datos POST.