XLV. Funciones para Hyperwave

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 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.

Requirimientos

Esta extensión requiere un servidor Hyperwave que se puede obtener de la dirección http://www.hyperwave.com/.

Instalación

Esta extension PECL no esta ligada a PHP.

Para poder utilizar estas funciones, se debe compilar PHP con soporte para Hyperwave mediante la opción --with-hyperwave[=DIR] .

Los usuarios de Windows deben habilitar php_hyperwave.dll dentro del archivo php.ini para poder emplear las funciones. Podeis descargar esta DLL de las extensiones PECL desde la pagina PHP Downloads o desde http://snaps.php.net/.

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 $_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:

RewriteRule ^/(.*) /usr/local/apache/htdocs/HyperWave/$1 [L]

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:

RewriteRule ^/hw/(.*) /usr/local/apache/htdocs/hw/$1 [L]

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

RewriteEngine on

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.

Configuración en tiempo de ejecución

El comportamiento de estas funciones está afectado por los valores definidos en php.ini.

Tabla 1. Opciones de configuración de Hyperwave

NombreValor por defectoDonde se cambiaRegistro de cambios
hyperwave.allow_persistent"0"PHP_INI_SYSTEMDisponible desde PHP 4.3.2.
hyperwave.default_port"418"PHP_INI_ALL 
For further details and definitions of the PHP_INI_* constants, see the Apéndice H.

Tipos de recursos

Esta extensión no tiene ningún tipo de recurso definido.

Constantes predefinidas

Estas constantes están definidas por esta extensión y estarán disponibles solamente cuando la extensión ha sido o bien compilada dentro de PHP o grabada dinámicamente en tiempo de ejecución.

HW_ATTR_LANG (integer)

HW_ATTR_NR (integer)

HW_ATTR_NONE (integer)

Pendientes

Aún hay varias cosas pendientes:

  • hw_InsertDocument debe dividirse en hw_InsertObject() y hw_PutDocument().

  • Los nombres de algunas funciones aún no están fijados.

  • Muchas funciones precisan la conexión actual como primer parámetro. Esto obliga a escribir mucho, lo cual no es con frecuencia necesario si sólo hay una conexión abierta. Una conexión por defecto mejoraría esto.

  • La conversión de registro de objeto a tabla de objeto necesita manipular cualquier atributo múltiple.

Tabla de contenidos
hw_Array2Objrec -- Convierte atributos de tabla de objeto a registro de objeto
hw_changeobject --  Modifica los atributos de un objeto (obsoleta)
hw_Children -- Id de objeto de los hijos
hw_ChildrenObj -- Registros de objeto de los hijos
hw_Close -- Cierra la conexión Hyperwave
hw_Connect -- Abre una conexión
hw_connection_info --  Muestra información sobre la conexión con un servidor Hyperwave
hw_cp -- Copia objetos
hw_Deleteobject -- Borra objetos
hw_DocByAnchor -- Id del objeto al que pertenece un enlace
hw_DocByAnchorObj -- Registro de objeto al que pertenece un enlace
hw_Document_Attributes -- Registro de objeto de hw_document
hw_Document_BodyTag -- Body tag of hw_document
hw_Document_Content -- Returns content of hw_document
hw_Document_SetContent -- Sets/replaces content of hw_document
hw_Document_Size -- Size of hw_document
hw_dummy --  Hyperwave dummy function
hw_EditText -- Recupera documento de texto
hw_Error -- Número de error
hw_ErrorMsg -- Devuelve un mensaje de error
hw_Free_Document -- Libera un documento_hw
hw_GetAnchors -- Id de objeto de los enlaces de un documento
hw_GetAnchorsObj -- Registros de objeto de los enlaces de un documento
hw_GetAndLock -- Devuelve registro de objeto y lo bloquea
hw_GetChildColl -- Id de objeto de colecciones hijas
hw_GetChildCollObj -- Registros de objeto de colecciones hijas
hw_GetChildDocColl -- Id de objeto de documentos hijos de una colección
hw_GetChildDocCollObj -- Registros de objeto de documentos hijos de una colección
hw_GetObject -- Registro de objeto
hw_GetObjectByQuery -- Buscar objeto
hw_GetObjectByQueryColl -- Buscar objeto en colección
hw_GetObjectByQueryCollObj -- Buscar objeto en colección
hw_GetObjectByQueryObj -- Buscar objeto
hw_GetParents -- Id de objeto de los padres
hw_GetParentsObj -- Registros de objeto de los padres
hw_getrellink --  Get link from source to dest relative to rootid
hw_GetRemote -- Obtiene un documento remoto
hw_GetRemoteChildren -- Obtiene el hijo del documento remoto
hw_GetSrcByDestObj -- Devuelve los enlaces que apuntan al objeto
hw_GetText -- Obtiene un documento de texto
hw_getusername -- Nombre del usuario actualmente conectado
hw_Identify -- Identificarse como usuario
hw_incollections -- Comprueba si los id de objeto están en las colecciones
hw_Info -- Información sobre conexión
hw_InsColl -- Insertar colección
hw_InsDoc -- Insertar documento
hw_insertanchors --  Inserts only anchors into text
hw_InsertDocument -- Subir cualquier objeto
hw_InsertObject -- Inserta un registro de objeto
hw_mapid -- Mapea in id global a un id virtual local
hw_Modifyobject -- Modifica el registro de objeto
hw_Mv -- Mueve objetos
hw_New_Document -- Crear nuevo documento
hw_Objrec2Array -- Convierte atributos de registro de objeto a tabla de objetos
hw_Output_Document -- Prints hw_document
hw_pConnect -- Hacer una conexión de base de datos permanente
hw_PipeDocument -- Recupera cualquier documento
hw_Root -- ID del objeto raíz
hw_setlinkroot --  Set the id to which links are calculated
hw_stat --  Returns status string
hw_Unlock -- Desbloquea objeto
hw_Who -- Lista de los usuarios actualmente conectados

Hosting by: hurra.com
Generated: 2007-01-26 18:00:48