Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
La construcción de un
depurador de VRML en Java
Contenido CAPÍTULO 24
2
• Conceptos básicos
• Diseño
• Aumento de la depuración
• Uso de VermelTest
• Adición de Capacidad
Conceptos básicos
Al igual que los otros proyectos en este libro, que se iniciará a partir de un
diseño muy básico y, a continuación, construir sobre ella. Para empezar, el
depurador se limitará a la impresión de sólo el tipo de nodo.
Para mantener la cantidad de código tan pequeño como sea posible, voy a
utilizar un sistema recursivo. El constructor se traza un nodo raíz desde el
punto de referencia, pero no hacer nada que no sea un poco de limpieza. Para
generar la salida, el método toString debe ser llamado. Esto se da luego el
nodo raíz y analizar la scenegraph recursiva utilizando llamadas a métodos
privados internos.
La Primera Etapa
Sin embargo, incluso esto llevará un poco de trabajo, desde cualquier nodo de
4
VRML que tenga un SF / MFNode tipo de campo se necesita tener que preguntó
sobre el terreno, utilizando el código específico de la situación (es decir, las
interfaces internas o externas). Por esta razón, no vamos a ser capaces de
crear una clase base genérica y luego extenderla a las secuencias de
comandos y la interfaz externa.
Todos mis ejemplos hasta ahora han utilizado el EAI, por lo que para este
proyecto voy a tomar un rumbo diferente y empezar con uno basado en
secuencias de comandos. Voy a extender a la EAI en una etapa posterior.
La construcción de la depuración
Primeros pasos con las reglas anteriores hace que el código bastante fácil. Es
casi un caso de la conexión de los puntos.
Lo Básico
En primer lugar, tenemos que poner juntos el esquema básico del código.
Después de la obligación de los comentarios en la parte superior del archivo,
luego importar la API de secuencias de comandos de paquetes. Después de
esto, declaramos el único en esta clase de archivos VrmlDebug. Se trata de una
clase pública.
/ / Vrml Depurador
/ / Copyright 1997 Justin Sofá justin@vlc.com.au
/ /
/ / Dado un nodo raíz Esto rastrear todos los hijos e imprimir
/ / Una versión formateada de la lista de nodos.
Debido a que será necesario extraer los ganglios de los niños de algunos
sectores de las clases, tenemos que emitir los nodos a un nodo. BaseNode la
clase no nos permite obtener cualquiera de los campos de un nodo.
Tenemos una base que tenga un constructor de Nodo y hace una referencia
interna a la misma.
Determinar el tipo de nodo que hemos comienza con una llamada al método de
GetType el nodo dado como parámetro del método. La razón para utilizar el
parámetro de nodo, en lugar de algunos de clase mundial de valor, es que el
método es el parseNode recursiva una. Si tenemos algún nodo mundial,
entonces la recursión recibirían horriblemente fuera de sincronía con gran
rapidez. Usted podría evitar los problemas de reajuste por el valor después de
haber llamado parseNode de nuevo, pero esto es sólo un extra que hay que
hacer que las cosas lentamente.
Una vez que la cadena que representa el nombre del nodo se obtiene,
podemos determinar lo que es el nodo. Para analizar con mayor rapidez, quiero
evitar el mayor número de comparaciones de cadenas como sea posible. El
primer paso es romper el punto de toma de decisiones mirando el primer
carácter del nombre.
if (node_type == null)
return (null);
intentar
(
char2 = node_type.charAt (1);
)
de capturas (StringIndexOutOfBoundsException e)
(
return (guión + "PROTO nodo:" + node_type);
)
Como con todos los nombres de nodo, la primera carta es una sociedad de
capital, dando lugar a un gran cambio que ha estado un caso por cada carta
que se inicia cualquier nombre de nodo.
Si nos dirigimos con esta prueba básica, que pronto en problemas. ¿Qué pasa
con PROTO / EXTERNPROTO tipo nodos? El método GetType devuelve la cadena
que es el nombre PROTO. El prototipo que SimpleShape camino de regreso se
desarrolló en el capítulo 3 tendría la cadena "SimpleShape" ha obtenido como
el tipo. Cuando llegamos a la transformación del nombre, podríamos considerar
erróneamente que este era uno de los incorporados en los nodos. Para evitar
este problema, que hacemos un control final. Si la cadena coincide
exactamente con el nombre de nodo de VRML, entonces el método de la clase
que se llama. Si no es así, entonces una línea que se imprime el nodo que se
declara como un PROTO y su nombre:
Una típica de nivel superior de análisis de rutina que ahora como el siguiente:
caso 'A':
switch (char2)
(
case 'n':
if (node_type.equals ( "Ancla"))
return (Ancla (nodo, guión));
case 'p':
if (node_type.equals ( "Apariencia"))
return (Apariencia (nodo, guión));
case 'u':
if (node_type.equals ( "AudioClip"))
return (AudioClip (nodo, guión));
por defecto:
return (guión + "PROTO nodo:" + node_type);
)
Excepciones a la regla
Si se analiza sólo este nodo, no sería muy buena, porque no estamos recursing
la scenegraph. ¿Qué hay que hacer es comprobar los nodos que tienen hijos
(de cualquier nodo que tiene un SF / MFNode campo) y, a continuación,
analizar los niños. Esta es una tarea relativamente simple.
Para cada nodo que tiene hijos, recuperar el niño o los niños y, a continuación,
llamar parseNode para cada niño. Obtener el nodo para pasar a parseNode es
un proceso de dos pasos. En primer lugar, usted necesita para obtener el
exposedField en sí mismo, y entonces usted necesita para recuperar el nodo de
referencia para este ámbito:
if (color! = null)
(
ch_node = color.getValue ();
str + = parseNode (ch_node, guión + "");
)
9
El código anterior sólo funciona para los campos SFNode. Si se trata de MFNode
campos, sólo una pequeña cantidad de trabajo adicional que se necesita:
children.getValue (child_list);
for (i = 0; i <size; i + +)
str + = parseNode (child_list [i], guión + "");
return (str);
)
Limitaciones
Hay algunas limitaciones impuestas por los mismos nodos. El representante de una colisión
nodo tiene acceso sólo campo. Una vez creado, no podemos localizar a los niños de la
delegación de voto, por lo que no podemos imprimir la información.
Protos y scripts también presenta problemas. Ambos pueden contener campos arbitraria y
nombres de campo, que no podemos manejar en un sistema dinámico como este depurador.
VRML actualmente no ofrece ningún medio de obtener una lista de campos que un nodo
pueda contener. Para las secuencias de comandos y protos, esta es una limitación
especialmente frustrante.
10
Por ahora usted también es probablemente la razón por la que insistió en preguntarse sobre
el uso de mi propia cadena de rutinas que cada nodo tiene un método toString ya. El
problema con toString es que nadie ha decidido exactamente lo que se imprime a partir de
este nodo. RECURSE que se establecen los niños o simplemente imprimir información
acerca de ese nodo? Cada navegador puede producir una cosa diferente, por lo que el
enfoque más seguro es hacer todo nosotros mismos.
Uso de VermelTest
Pruebas y uso de la biblioteca de depuración son casi la misma cosa. Para probar el código,
es necesario utilizar la biblioteca y ver la salida.
Una vez que haya importado la biblioteca en su archivo de comandos de Java, puede
escribir un script muy simple. Todo lo que necesitas hacer es obtener el nodo de un campo
en el guión, crear una instancia de la depuración y, a continuación, imprimir los resultados a
través de System.out. El conjunto de nuestra clase de prueba tiene este aspecto:
VrmlDebug de importación;
importación vrml .*;
importación vrml.field .*;
importación vrml.node .*;
El archivo de VRML puede ser tan simple o tan complejo como desee. Sólo hay una
restricción: Usted necesidad de mantener toda la información que el niño de la raíz nodo
determinado. Este grupo es como la secuencia de comandos es un nodo del mundo para
rastrear.
(
# Poner su lista de nodos de aquí
)
Script
(
campo SFNode raíz USO root_node
url "VrmlTest.class"
)
En primer lugar en la lista de los que tienen-está llena nodo impresiones. Todos los
exposedFields deben tener sus valores impresos. Tal vez te gustaría también añadir la actual
eventOut valores, también. Para ello, todo lo que necesita hacer es añadir código en los
métodos apropiados para recuperar el valor del campo y convertirlo en una cadena. La
biblioteca de la JVerge capítulo anterior hace exactamente lo mismo cuando se consulta un
nodo con sus métodos de obtener.
Tras esta acción, tal vez quiera decir que para localizar sólo a una cierta profundidad. Para
ello, es necesario añadir un argumento adicional a todos los métodos de análisis sintáctico,
entre ellos toString. En cualquier lugar que usted llame recursivamente parseNode, usted
pasa por "la profundidad - 1." En la parseNode método, que acaba de hacer un cheque por
este valor y el retorno a fondo si es cero.
Quizás otra característica útil es algún tipo de capacidad de síntesis. Usted podría crear una
lista de contadores para cada nodo como una variable de clase y el incremento adecuadas
para cada nodo que se encuentra en la transversal. Al final, todas las cifras son comparadas
y se convirtió en una cadena.
Por último, la otra cosa buena es tener un puerto de este código a la interfaz externa. Usted,
el lector ya muy experimentado, casi debería ser capaz de convertir entre código script y
código externo con los ojos cerrados! Si no es así, vuelva al sitio Web,
http://www.vlc.com.au/VermelTrap/, por las últimas revisiones.
Resumen
Bueno, nos alegra que haya llegado a la final! El depurador es el último de nuestros
proyectos para ti. Envuelve la mayoría de las características que hemos estado jugando con
todo el libro.
Esperamos que haya aprendido mucho no sólo acerca de VRML, pero también acerca de
12
Java y la forma de mezclar los dos. El VRML-Java combinación es muy fuerte y dará lugar
a muchos proyectos interesantes, no sólo en las páginas Web sino también en las
aplicaciones. Si decide crear algunos nifty trabajo como resultado de lo que hemos
presentado en el libro, envíanos un e-mail con su dirección URL. Nuestra web y
direcciones de correo electrónico se da en la parte delantera del libro.