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