JBossWeb SVN: r789 - in trunk/java: javax/servlet and 23 other directories.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2008-09-22 12:52:37 -0400 (Mon, 22 Sep 2008)
New Revision: 789
Added:
trunk/java/javax/el/LocalStrings_es.properties
trunk/java/javax/servlet/LocalStrings_es.properties
trunk/java/org/apache/catalina/manager/host/LocalStrings_es.properties
trunk/java/org/apache/coyote/ajp/LocalStrings_es.properties
trunk/java/org/apache/el/Messages_es.properties
Modified:
trunk/java/org/apache/catalina/authenticator/LocalStrings_es.properties
trunk/java/org/apache/catalina/connector/LocalStrings_es.properties
trunk/java/org/apache/catalina/core/LocalStrings_es.properties
trunk/java/org/apache/catalina/loader/LocalStrings_es.properties
trunk/java/org/apache/catalina/manager/LocalStrings_es.properties
trunk/java/org/apache/catalina/realm/LocalStrings_es.properties
trunk/java/org/apache/catalina/security/LocalStrings_es.properties
trunk/java/org/apache/catalina/servlets/LocalStrings_es.properties
trunk/java/org/apache/catalina/session/LocalStrings_es.properties
trunk/java/org/apache/catalina/startup/LocalStrings_es.properties
trunk/java/org/apache/catalina/util/LocalStrings_es.properties
trunk/java/org/apache/catalina/valves/LocalStrings_es.properties
trunk/java/org/apache/coyote/http11/LocalStrings_es.properties
trunk/java/org/apache/jasper/resources/LocalStrings_es.properties
trunk/java/org/apache/naming/LocalStrings_es.properties
trunk/java/org/apache/naming/resources/LocalStrings_es.properties
trunk/java/org/apache/tomcat/util/buf/res/LocalStrings_es.properties
trunk/java/org/apache/tomcat/util/http/res/LocalStrings_es.properties
trunk/java/org/apache/tomcat/util/net/jsse/res/LocalStrings_es.properties
trunk/java/org/apache/tomcat/util/net/res/LocalStrings_es.properties
Log:
- Update Spanish translation.
Added: trunk/java/javax/el/LocalStrings_es.properties
===================================================================
--- trunk/java/javax/el/LocalStrings_es.properties (rev 0)
+++ trunk/java/javax/el/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -0,0 +1,6 @@
+propertyNotFound = Propiedad ''{1}'' no hallada en el tipo {0}
+propertyNotReadable = Propiedad ''{1}'' no legible para el tipo {0}
+propertyNotWritable = Propiedad ''{1}'' no grabable para el tipo {0}
+propertyReadError = Error reading ''{1}'' en el tipo {0}
+propertyWriteError = Error writing ''{1}'' en el tipo {0}
+resolverNotWritable = ELResolver no grabable para el tipo {0}
Property changes on: trunk/java/javax/el/LocalStrings_es.properties
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/java/javax/servlet/LocalStrings_es.properties
===================================================================
--- trunk/java/javax/servlet/LocalStrings_es.properties (rev 0)
+++ trunk/java/javax/servlet/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -0,0 +1,3 @@
+err.not_iso8859_1 = No es un car\u00E1cter ISO 8859-1\: {0}
+value.true = true
+value.false = false
Property changes on: trunk/java/javax/servlet/LocalStrings_es.properties
___________________________________________________________________
Name: svn:executable
+ *
Modified: trunk/java/org/apache/catalina/authenticator/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/authenticator/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/authenticator/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,12 +1,28 @@
-authenticator.alreadyStarted=El interceptor de seguridad ya ha sido arrancado
-authenticator.certificates=No hay cadena de certificados del cliente en esta petici�n
-authenticator.forbidden=El acceso al recurso pedido ha sido denegado
-authenticator.formlogin=Referencia directa al formulario de conexi�n (p�gina de formulario de login) inv�lida
-authenticator.invalid=No es v�lida la cadena de certificados del cliente en esta petici�n
-authenticator.keystore=Excepci�n cargando el almac�n de claves
-authenticator.manager=Excepci�n inicializando administradores de confianza
-authenticator.notAuthenticated=Error de Configuraci�n: No se pueden realizar funciones de control de acceso sin un principal autenticado
-authenticator.notContext=Error de Configuraci�n: Debe de estar unido a un Contexto
-authenticator.notStarted=El Interceptor de seguridad no sido a�n iniciado
-authenticator.unauthorized=Imposible autenticar mediante las credenciales suministradas
-authenticator.userDataConstraint=Esta petici�n viola una Restrici�n de Datos de usuario para esta aplicaci�n
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+authenticator.alreadyStarted = El interceptor de seguridad ya ha sido arrancado
+authenticator.certificates = No hay cadena de certificados del cliente en esta petici\u00F3n
+authenticator.forbidden = El acceso al recurso pedido ha sido denegado
+authenticator.formlogin = Referencia directa al formulario de conexi\u00F3n (p\u00E1gina de formulario de login) inv\u00E1lida
+authenticator.invalid = No es v\u00E1lida la cadena de certificados del cliente en esta petici\u00F3n
+authenticator.keystore = Excepci\u00F3n cargando el almac\u00E9n de claves
+authenticator.manager = Excepci\u00F3n inicializando administradores de confianza
+authenticator.notAuthenticated = Error de Configuraci\u00F3n\: No se pueden realizar funciones de control de acceso sin un principal autenticado
+authenticator.notContext = Error de Configuraci\u00F3n\: Debe de estar unido a un Contexto
+authenticator.notStarted = El Interceptor de seguridad no sido a\u00FAn iniciado
+authenticator.requestBodyTooBig = El cuerpo del requerimiento era demasiado grande para realizar cach\u00E9 durante el proceso de autenticaci\u00F3n
+authenticator.sessionExpired = El tiempo permitido para realizar login ha sido excedido. Si deseas continuar, debes hacer clik dos veces y volver a hacer clik otra vez o cerrar y reabrir tu navegador
+authenticator.unauthorized = Imposible autenticar mediante las credenciales suministradas
+authenticator.userDataConstraint = Esta petici\u00F3n viola una Restrici\u00F3n de Datos de usuario para esta aplicaci\u00F3n
Modified: trunk/java/org/apache/catalina/connector/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/connector/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/connector/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,56 +1,64 @@
-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
# CoyoteConnector
+coyoteConnector.alreadyInitialized = Ya ha sido inicializado el conector
+coyoteConnector.alreadyStarted = Ya ha sido arrancado el conector
+coyoteConnector.cannotRegisterProtocol = No puedo registrar MBean para el Protocolo
+coyoteConnector.notStarted = El conector Coyote no ha sido arrancado
+coyoteConnector.protocolHandlerDestroyFailed = Fall\u00F3 la destrucci\u00F3n del manejador de protocolo\: {0}
+coyoteConnector.protocolHandlerInitializationFailed = Fall\u00F3 la inicializaci\u00F3n del manejador de protocolo\: {0}
+coyoteConnector.protocolHandlerInstantiationFailed = Fall\u00F3 la instanciaci\u00F3n del manejador de protocolo\: {0}
+coyoteConnector.protocolHandlerStartFailed = Fall\u00F3 el arranque del manejador de protocolo\: {0}
+coyoteConnector.protocolRegistrationFailed = Fall\u00F3 el registro de JMX
+coyoteConnector.protocolHandlerPauseFailed = Ha fallado la pausa del manejador de protocolo
+coyoteConnector.protocolHandlerResumeFailed = Ha fallado el rearranque del manejador de protocolo
+coyoteConnector.MapperRegistration = Mapeador de registro\: {0}
+coyoteConnector.protocolUnregistrationFailed = Ha fallado la parada del manejador de protocolo
#
-
-coyoteConnector.alreadyInitialized=Ya ha sido inicializado el conector
-coyoteConnector.alreadyStarted=Ya ha sido arrancado el conector
-coyoteConnector.cannotRegisterProtocol=No puedo registrar MBean para el Protocolo
-coyoteConnector.notStarted=El conector Coyote no ha sido arrancado
-coyoteConnector.protocolHandlerDestroyFailed=Fall� la destrucci�n del manejador de protocolo: {0}
-coyoteConnector.protocolHandlerInitializationFailed=Fall� la inicializaci�n del manejador de protocolo: {0}
-coyoteConnector.protocolHandlerInstantiationFailed=Fall� la instanciaci�n del manejador de protocolo: {0}
-coyoteConnector.protocolHandlerStartFailed=Fall� el arranque del manejador de protocolo: {0}
-coyoteConnector.protocolRegistrationFailed=Fall� el registro de JMX
-
-#
# CoyoteAdapter
+coyoteAdapter.service = Ha tenido lugar una excepci\u00F3n o error en el contenedor durante el procesamiento del requerimiento
+coyoteAdapter.read = El servlet no ley\u00F3 todos los bytes disponibles durante el procesamiento del evento de lectura
#
-
-coyoteAdapter.service=Ha tenido lugar una excepci�n o error en el contenedor durante el procesamiento del requerimiento
-
-#
# CoyoteResponse
+coyoteResponse.getOutputStream.ise = getWriter() ya ha sido llamado para esta respuesta
+coyoteResponse.getWriter.ise = getOutputStream() ya ha sido llamado para esta respuesta
+coyoteResponse.resetBuffer.ise = No puedo limpiar el b\u00FAfer despu\u00E9s de que la repuesta ha sido llevada a cabo
+coyoteResponse.sendError.ise = No puedo llamar a sendError() tras llevar a cabo la respuesta
+coyoteResponse.sendRedirect.ise = No puedo llamar a sendRedirect() tras llevar a cabo la respuesta
+coyoteResponse.setBufferSize.ise = No puedo cambiar la medida del b\u00FAfer tras escribir los datos
#
-
-coyoteResponse.getOutputStream.ise=getWriter() ya ha sido llamado para esta respuesta
-coyoteResponse.getWriter.ise=getOutputStream() ya ha sido llamado para esta respuesta
-coyoteResponse.resetBuffer.ise=No puedo limpiar el b�fer despu�s de que la repuesta ha sido llevada a cabo
-coyoteResponse.sendError.ise=No puedo llamar a sendError() tras llevar a cabo la respuesta
-coyoteResponse.sendRedirect.ise=No puedo llamar a sendRedirect() tras llevar a cabo la respuesta
-coyoteResponse.setBufferSize.ise=No puedo cambiar la medida del b�fer tras escribir los datos
-
-#
# CoyoteRequest
+coyoteRequest.getInputStream.ise = getReader() ya ha sido llamado para este requerimiento
+coyoteRequest.getReader.ise = getInputStream() ya ha sido llamado para este requerimiento
+coyoteRequest.sessionCreateCommitted = No puedo crear una sesi\u00F3n despu\u00E9s de llevar a cabo la respueta
+coyoteRequest.setAttribute.namenull = No pudeo llamar a setAttribute con un nombre nulo
+coyoteRequest.listenerStart = Excepci\u00F3n enviando evento inicializado de contexto a instancia de escuchador de clase {0}
+coyoteRequest.listenerStop = Excepci\u00F3n enviando evento destru\u00EDdo de contexto a instancia de escuchador de clase {0}
+coyoteRequest.attributeEvent = Excepci\u00F3n lanzada mediante el escuchador de eventos de atributos
+coyoteRequest.parseParameters = Excepci\u00F3n lanzada al procesar par\u00E1metros POST
+coyoteRequest.postTooLarge = No se analizaron los par\u00E1metros porque la medida de los datos enviados era demasiado grande. Usa el atributo maxPostSize del conector para resolver esto en caso de que la aplicaci\u00F3n debiera de aceptar POSTs m\u00E1s grandes.
+requestFacade.nullRequest = El objeto de requerimiento ha sido reciclado y ya no est\u00E1 asociado con esta fachada
+responseFacade.nullResponse = El objeto de respuesta ha sido reciclado y ya no est\u00E1 asociado con esta fachada
+cometEvent.nullRequest = El objeto de evento ha sido reciclado y ya no est\u00E1 asociado con este requerimiento
+mapperListener.unknownDefaultHost = M\u00E1quina por defecto desconocida\: {0}
+mapperListener.registerHost = Registrar m\u00E1quina {0} en dominio {1}
+mapperListener.unregisterHost = Desregistrar m\u00E1quina {0} en dominio {1}
#
-
-coyoteRequest.getInputStream.ise=getReader() ya ha sido llamado para este requerimiento
-coyoteRequest.getReader.ise=getInputStream() ya ha sido llamado para este requerimiento
-coyoteRequest.sessionCreateCommitted=No puedo crear una sesi�n despu�s de llevar a cabo la respueta
-coyoteRequest.setAttribute.namenull=No pudeo llamar a setAttribute con un nombre nulo
-coyoteRequest.listenerStart=Excepci�n enviando evento inicializado de contexto a instancia de escuchador de clase {0}
-coyoteRequest.listenerStop=Excepci�n enviando evento destru�do de contexto a instancia de escuchador de clase {0}
-coyoteRequest.attributeEvent=Excepci�n lanzada mediante el escuchador de eventos de atributos
-coyoteRequest.postTooLarge=No se analizaron los par�metros porque la medida de los datos enviados era demasiado grande. Usa el atributo maxPostSize del conector para resolver esto en caso de que la aplicaci�n debiera de aceptar POSTs m�s grandes.
-
-
-#
# MapperListener
-#
-
-mapperListener.registerContext=Registrar Contexto {0}
-mapperListener.unregisterContext=Desregistrar Contexto {0}
-mapperListener.registerWrapper=Registrar Arropador (Wrapper) {0} en Contexto {1}
-
-
-
+mapperListener.registerContext = Registrar Contexto {0}
+mapperListener.unregisterContext = Desregistrar Contexto {0}
+mapperListener.registerWrapper = Registrar Arropador (Wrapper) {0} en Contexto {1}
+inputBuffer.streamClosed = Flujo cerrado
Modified: trunk/java/org/apache/catalina/core/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/core/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/core/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,174 +1,214 @@
-applicationContext.attributeEvent=Excepci�n lanzada por escuchador de eventos de atributos
-applicationContext.mapping.error=Error durante mapeo
-applicationContext.requestDispatcher.iae=La Trayectoria {0} no comienza con car�cter "/"
-applicationContext.setAttribute.namenull=El nombre no puede ser nulo
-applicationDispatcher.allocateException=Excepci�n de reserva de espacio para servlet {0}
-applicationDispatcher.deallocateException=Excepci�n de recuperaci�n de espacio para servlet {0}
-applicationDispatcher.forward.ise=No puedo reenviar despu�s de que la respuesta se haya llevado a cabo.
-applicationDispatcher.forward.throw=El recurso reenviado lanz� un excepci�n
-applicationDispatcher.include.throw=El recurso inclu�do lanz� una excepci�n
-applicationDispatcher.isUnavailable=El Servlet {0} no est� disponible en este momento
-applicationDispatcher.serviceException=El Servlet.service() para servlet {0} lanz� una excepci�n
-applicationRequest.badParent=No puedo localizar la implementaci�n de Requerimiento padre
-applicationRequest.badRequest=El requerimiento no es un javax.servlet.ServletRequestWrapper
-applicationResponse.badParent=No puedo localizar implementaci�n de Respuesta padre
-applicationResponse.badResponse=La Respuesta no es un javax.servlet.ServletResponseWrapper
-containerBase.addDefaultMapper=Excepci�n configurando mapeador por defecto de clase {0}
-containerBase.alreadyStarted=Ya ha sido arrancado el Contenedor {0}
-containerBase.notConfigured=No se ha configurado V�lvula b�sica
-containerBase.notStarted=No se ha arrancado el Contenedor {0}
-fastEngineMapper.alreadyStarted=Ya se ha arrancado el FastEngineMapper {0}
-fastEngineMapper.notStarted=No se ha arrancado a�n el FastEngineMapper {0}
-filterChain.filter=La ejecuci�n del Filtro lanz� una excepci�n
-filterChain.servlet=La ejecuci�n del Servlet lanz� una excepci�n
-httpContextMapper.container=Este Contenedor no es un StandardContext
-httpEngineMapper.container=Este Contenedor no es un StandardEngine
-httpHostMapper.container=Esta Contenedor no es una StandardHost
-interceptorValve.alreadyStarted=Ya ha sido arrancada la InterceptorValve
-interceptorValve.notStarted=A�n no ha sido arrancada la InterceptorValve
-naming.bindFailed=No pude cambiar (bind) objeto: {0}
-naming.unbindFailed=No pude descambiar (unbind) objecto: {0}
-naming.invalidEnvEntryType=La entrada de Entorno {0} tiene un tipo inv�lido
-naming.invalidEnvEntryValue=La entrada de Entorno {0} tiene un valor inv�lido
-naming.namingContextCreationFailed=Fall� la creaci�n del contexto de nombres (naming): {0}
-standardContext.alreadyStarted=Ya se ha arrancado el Contexto
-standardContext.applicationListener=Error configurando escuchador de aplicaci�n de clase {0}
-standardContext.applicationSkipped=Se ha saltado la instalaci�n de escuchadores de aplicaci�n debido a error(es) previo(s)
-standardContext.badRequest=Trayectoria de requerimiento inv�lida ({0}).
-standardContext.errorPage.error=La localizaci�n de la p�gina de error 0} debe de comenzar con ''/''
-standardContext.errorPage.required=ErrorPage no puede ser nulo
-standardContext.errorPage.warning=AVISO: La localizaci�n de la p�gina de error {0} debe de comenzar con ''/'' en Servlet 2.4
-standardContext.filterMap.either=El mapeo de filtro debe de especificar o un <url-pattern> o un <servlet-name>
-standardContext.filterMap.name=El mapeo de filtro especifica un nombre desconocido de filtro {0}
-standardContext.filterMap.pattern=<url-pattern> {0} inv�lido en mapeo de filtro
-standardContext.filterStart=Excepci�n arrancando filtro {0}
-standardContext.filterStartFailed=No pude arrancar Filtros de aplicaci�n con �xito
-standardContext.requestListenerStartFailed=No pude arrancar v�lvula de escuchador de requerimiento con exito
-standardContext.requestListenerConfig.added=A�adida V�lvula de escuchador de requerimiento
-standardContext.requestListenerConfig.error=Excepci�n a�adiendo V�lvula de escuchador de requerimiento: {0}
-standardContext.isUnavailable=Esta aplicaci�n no est� disponible en este momento
-standardContext.listenerStart=Excepci�n enviando evento inicializado de contexto a instancia de escuchador de clase {0}
-standardContext.listenerStartFailed=No pude arrancar Escuchadores de aplicaci�n con �xito
-standardContext.listenerStop=Excepci�n enviando evento de contexto destru�do a instancia de escuchador de clase {0}
-standardContext.loginConfig.errorPage=La P�gina de error de Formulario {0} debe de comenzar con ''/'
-standardContext.loginConfig.errorWarning=AVISO: La p�gina de error de Formulario {0} debe de comenzar con ''/'' en Servlet 2.4
-standardContext.loginConfig.loginPage=La p�gina de login de Formulario {0} debe de comenzar con ''/'
-standardContext.loginConfig.loginWarning=AVISO: La p�gina de login de Formulario {0} debe de comenzar con ''/'' en Servlet 2.4
-standardContext.loginConfig.required=LoginConfig no puede ser nula
-standardContext.mappingError=Error de configuraci�n de MAPEO para URI relativa {0}
-standardContext.notFound=El recurso requerido ({0}) no se encuentra disponible
-standardContext.notReloadable=Est� desactivada la recarga en este Contexto
-standardContext.notStarted=A�n no se ha arrancado el Contexto
-standardContext.notWrapper=El Hijo de un Contexto debe de ser un Arropador (Wrapper)
-standardContext.parameter.duplicate=Duplicado par�metro de inicializaci�n de contexto {0}
-standardContext.parameter.required=Es necesario poner nombre de par�metro y valor de par�metro
-standardContext.reloadingCompleted=Se ha completado la Regarga de este Contexto
-standardContext.reloadingFailed=Fall� la recarga de este Contexto debido a errores previos
-standardContext.reloadingStarted=Ha comenzado la recarga de este Contexto
-standardContext.requestListener.requestInit=Una excepci�n durante el env�o de requerimiento ha iniciado un evento de ciclo de vida (lifecycle event) para la instancia de clase a la escucha (listener) {0}
-standardContext.requestListener.requestDestroy=Una excepci�n durante el env�o de requerimiento ha destru�do un evento de ciclo de vida (lifecycle event) para la instancia de clase a la escucha (listener) {0}
-standardContext.resourcesStart=Error arrancando Recursos est�ticos
-standardContext.securityConstraint.pattern=<url-pattern> {0} inv�lida en restricci�n de seguridad
-standardContext.servletMap.name=El mapeo de Servlet especifica un nombre de servlet desconocido {0}
-standardContext.servletMap.pattern=<url-pattern> {0} inv�lida en mapeo de servlet
-standardContext.startCleanup=Excepci�n durante la limpieza tras no poder arrancar
-standardContext.startFailed=Fall� en arranque del Contexto [{0}] debido a errores previos
-standardContext.startingLoader=Excepci�n arrancando Cargador
-standardContext.startingManager=Excepci�n arrancando Gestor
-standardContext.startingWrapper=Excepci�n arrancando Arropador (Wrapper) para servlet {0}
-standardContext.stoppingContext=Excepci?n parando Context
-standardContext.stoppingLoader=Excepci�n parando Cargador
-standardContext.stoppingManager=Excepci�n parando Gestor
-standardContext.stoppingWrapper=Excepci�n parando Arropador (Wrapper) para servlet {0}
-standardContext.urlDecode=No puedo decodificar URL de trayectoria de requerimiento {0}
-standardContext.urlPattern.patternWarning=AVISO: el patr�n URL {0} debe de comenzar con ''/'' en Servlet 2.4
-standardContext.urlValidate=No puedo validar trayectoria de requerimiento de URL decodificada {0}
-standardContext.wrapper.error=El archivo JSP {0} debe de comenzar con ''/'
-standardContext.wrapper.warning=AVISO: El archivo JSP {0} debe de comenzar con ''/'' en Servlet 2.4
-standardEngine.alreadyStarted=Ya ha sido arrancado el Motor
-standardEngine.mappingError=Error de configuraci�n de MAPEO para nombre de servidor {0}
-standardEngine.noHost=No hay M�quina que coincida con nombre de servidor {0}
-standardEngine.noHostHeader=Requerimiento HTTP/1.1 sin M�quina: cabecera
-standardEngine.notHost=El Hijo de un Motor debe de ser un M�quina
-standardEngine.notParent=El Motor no puede tener un Contenedor padre
-standardEngine.notStarted=A�n no se ha arrancado el Motor
-standardEngine.unfoundHost=M�quina virtual {0} no hallada
-standardEngine.unknownHost=No se ha especificado m�quina servidora en este requerimiento
-standardHost.accessBase=No puedo acceder a directorio base de documento {0}
-standardHost.alreadyStarted=Ya ha sido arrancada la M�quina
-standardHost.appBase=No existe el directorio base de aplicaci�n {0}
-standardHost.clientAbort=El Cliente Remoto Abort� el Requerimiento, IOException: {0}
-standardHost.configRequired=Es necesario poner la URL a archivo de configuraci�n
-standardHost.configNotAllowed=No se permite el uso del archivo de configuraci�n
-standardHost.installBase=S�lo se pueden instalar aplicaciones web en el directorio de aplicaciones web de M�quina
-standardHost.installing=Instalando aplicaciones web en trayectoria de contexto {0} desde URL {1}
-standardHost.installingWAR=Instalando aplicaci�n web desde URL {0}
-standardHost.installingXML=Procesando URL de archivo de configuraci�n de Contexto {0}
-standardHost.installError=Error desplegando aplicaci�n en trayectoria de contexto {0}
-standardHost.invalidErrorReportValveClass=No pude cargar clase especifiada de v�lvula de informe de error: {0}
-standardHost.docBase=Ya existe el directorio base de documento {0}
-standardHost.mappingError=Error de configuraci�n de MAPEO para URI de requerimiento {0}
-standardHost.noContext=No se ha configurado Contexto para procesar este requerimiento
-standardHost.noHost=No se ha configurado M�quina para procesar este requerimiento
-standardHost.notContext=El Hijo de una M�quina debe de ser un Contexto
-standardHost.notStarted=A�n no se ha arrancado la M�quina
-standardHost.nullName=Es necesario poner el nombre de M�quina
-standardHost.pathFormat=Trayectoria de contexto inv�lida: {0}
-standardHost.pathMatch=La trayectoria de Contexto {0} debe de coincidir con el nombre de directorio o de archivo WAR: {1}
-standardHost.pathMissing=La trayectoria de Contexto {0} no est� en uso en este momento
-standardHost.pathRequired=Es necesario poner la trayectoria de Contexto
-standardHost.pathUsed=Ya est� en uso la trayectoria de Contexto {0}
-standardHost.removing=Quitando aplicaci�n web en trayectoria de contexto {0}
-standardHost.removeError=Error quitando aplicaci�n en trayectoria de contexto {0}
-standardHost.start=Arrancando aplicaci�n web en trayectoria de contexto {0}
-standardHost.stop=Parando aplicaci�n web en trayectoria de contexto {0}
-standardHost.unfoundContext=No puedo hallar contexto para URI de requerimiento {0}
-standardHost.warRequired=Es necesario poner la URL a archivo de aplicaci�n web
-standardHost.warURL=URL inv�lida para archivo de aplicaci�n web: {0}
-standardHost.validationEnabled=Activada la validaci�n XML
-standardHost.validationDisabled=Desactivada la validaci�n XML
-standardPipeline.alreadyStarted=Ya se ha arrancado la Tuber�a (Pipeline)
-standardPipeline.notStarted=No se ha arrancado la Tuber�a (Pipeline)
-standardPipeline.noValve=No hay m�s V�lvulas en la Tuber�a (Pipeline) procesando este requerimiento
-standardServer.addContainer.ise=No hay conectores disponibles para ser asociados con este contenedor
-standardServer.initialize.initialized=Ya se ha inicializado este servidor
-standardServer.start.connectors=Al menos un conector no est� asociado con cualquier contenedor
-standardServer.start.started=Ya ha sido arrancado este servidor
-standardServer.stop.notStarted=A�n no ha sido arrancado este servidor
-standardService.initialize.initialized=Ya ha sido inicializado este servicio
-standardService.start.name=Arrancando servicio {0}
-standardService.start.started=Ya ha sido arrancado este sercicio
-standardService.stop.name=Parando servicio {0}
-standardService.stop.notStarted=A�n no se ha arrancado este servicio
-standardWrapper.allocate=Error reservando espacio para una instancia de servlet
-standardWrapper.allocateException=Excepci�n de reserva de espacio para servlet {0}
-standardWrapper.containerServlet=Cargando servlet de contenedor {0}
-standardWrapper.createFilters=Excepci�n de creaci�n de filtros para servlet {0}
-standardWrapper.deallocateException=Excepci�n de recuperaci�n de espacio para servlet {0}
-standardWrapper.destroyException=Servlet.destroy() para servlet {0} lanz� excepci�n
-standardWrapper.exception0=Informe de Excepci�n de Tomcat
-standardWrapper.exception1=Ha tenido lugar una Excepci�n de Servlet
-standardWrapper.exception2=Informe de Excepci�n:
-standardWrapper.exception3=Causa Ra�z:
-standardWrapper.initException=Servlet.init() para servlet {0} lanz� excepci�n
-standardWrapper.instantiate=Error instanciando clase de servlet {0}
-standardWrapper.isUnavailable=El Servlet {0} no est� disponible en este momento
-standardWrapper.jasperLoader=Usando cargador de clases (classloader) de Jasper para servlet {0}
-standardWrapper.jspFile.format=El archivo JSP {0} no comienza con car�cter ''/''
-standardWrapper.loadException=El Servlet {0} lanz� excepci�n de load()
-standardWrapper.missingClass=El Arropador (Wrapper) no puede hallar clase de servlet {0} o una clase de la que depende
-standardWrapper.missingLoader=El Arropador (Wrapper) no puede hallar Cargador para servlet {0}
-standardWrapper.notChild=El contenedor de Arropador (Wrapper) no puede tener contenedores hijo
-standardWrapper.notClass=No se ha especificado clase de servlet para servlet {0}
-standardWrapper.notContext=El contenedor padre para un Arropador (Wrapper) debe de ser un Contexto
-standardWrapper.notFound=No est� disponible el Servlet {0}
-standardWrapper.notServlet=La Clase {0} no es un Servlet
-standardWrapper.privilegedServlet=El Servlet de clase {0} es privilegiado y no puede ser cargado mediante esta aplicaci�n web
-standardWrapper.releaseFilters=Excepci�n de Liberaci�n de filtros para servlet {0}
-standardWrapper.serviceException=Servlet.service() para servlet {0} lanz� excepci�n
-standardWrapper.statusHeader=HTTP Estado {0} - {1}
-standardWrapper.statusTitle=Informe de Error de Tomcat
-standardWrapper.unavailable=Marcando el servlet {0} como no disponible
-standardWrapper.unloadException=El Servlet {0} lanz� excepci�n unload()
-standardWrapper.unloading=No puedo reservar espacio para servlet {0} porque est� siendo descargado
-standardWrapper.waiting=Esperando por {0} instancia(s) para recuperar su espacio reservado
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+applicationContext.attributeEvent = Excepci\u00F3n lanzada por escuchador de eventos de atributos
+applicationContext.mapping.error = Error durante mapeo
+applicationContext.requestDispatcher.iae = La Trayectoria {0} no comienza con car\u00E1cter "/"
+applicationContext.resourcePaths.iae = La Trayectoria {0} no comienza con car\u00E1cter "/"
+applicationContext.setAttribute.namenull = El nombre no puede ser nulo
+applicationDispatcher.allocateException = Excepci\u00F3n de reserva de espacio para servlet {0}
+applicationDispatcher.deallocateException = Excepci\u00F3n de recuperaci\u00F3n de espacio para servlet {0}
+applicationDispatcher.forward.ise = No puedo reenviar despu\u00E9s de que la respuesta se haya llevado a cabo.
+applicationDispatcher.forward.throw = El recurso reenviado lanz\u00F3 un excepci\u00F3n
+applicationDispatcher.include.throw = El recurso inclu\u00EDdo lanz\u00F3 una excepci\u00F3n
+applicationDispatcher.isUnavailable = El Servlet {0} no est\u00E1 disponible en este momento
+applicationDispatcher.serviceException = El Servlet.service() para servlet {0} lanz\u00F3 una excepci\u00F3n
+applicationDispatcher.specViolation.request = SevletRequest original o ServletRequest original arropado no pas\u00F3 a RequestDispatcher en violaci\u00F3n de SRV.8.2 y SRV.14.2.5.1
+applicationDispatcher.specViolation.response = SevletResponse original o ServletResponse original arropado no pas\u00F3 a RequestDispatcher en violaci\u00F3n de SRV.8.2 y SRV.14.2.5.1
+applicationRequest.badParent = No puedo localizar la implementaci\u00F3n de Requerimiento padre
+applicationRequest.badRequest = El requerimiento no es un javax.servlet.ServletRequestWrapper
+applicationResponse.badParent = No puedo localizar implementaci\u00F3n de Respuesta padre
+applicationResponse.badResponse = La Respuesta no es un javax.servlet.ServletResponseWrapper
+aprListener.aprInit = La biblioteca nativa de Apache Tomcat basada en ARP que permite un rendimiento \u00F3ptimo en entornos de desarrollo no ha sido hallada en java.library.path\: {0}
+aprListener.tcnInvalid = Se encuentra instalada una versi\u00F3n incompatible {0} de la biblioteca nativa APR de Apache Tomcat, mientras que Tomcat necesita la versi\u00F3n {1}
+aprListener.tcnVersion = Se encuentra instalada una versi\u00F3n muy vieja {0} de la biblioteca nativa APR de Apache Tomcat, mientras que Tomcat recomienda una versi\u00F3n mayor de {1}
+aprListener.aprDestroy = No pude apagar la biblioteca nativa de Apache Tomcat
+aprListener.sslInit = No pude inicializar el SSLEngine (Motor SSL)
+aprListener.tcnValid = Cargada la biblioteca nativa APR de Apache Tomcat {0}
+aprListener.flags = Capacidades APR\: IPv6 [{0}], enviar fichero [{1}], aceptar filtros [{2}], aleatorio [{3}].
+containerBase.addDefaultMapper = Excepci\u00F3n configurando mapeador por defecto de clase {0}
+containerBase.alreadyStarted = Ya ha sido arrancado el Contenedor {0}
+containerBase.notConfigured = No se ha configurado V\u00E1lvula b\u00E1sica
+containerBase.notStarted = No se ha arrancado el Contenedor {0}
+containerBase.backgroundProcess.cluster = Excepci\u00F3n al procesar cl\u00FAster {0} de proceso en segundo plano
+containerBase.backgroundProcess.loader = Excepci\u00F3n al procesar cargador {0} de proceso en segundo plano
+containerBase.backgroundProcess.manager = Excepci\u00F3n al procesar gestor {0} de proceso en segundo plano
+containerBase.backgroundProcess.realm = Excepci\u00F3n al procesar reino {0} de proceso en segundo plano
+containerBase.backgroundProcess.valve = Excepci\u00F3n al procesar v\u00E1lvula {0} de proceso en segundo plano
+fastEngineMapper.alreadyStarted = Ya se ha arrancado el FastEngineMapper {0}
+fastEngineMapper.notStarted = No se ha arrancado a\u00FAn el FastEngineMapper {0}
+filterChain.filter = La ejecuci\u00F3n del Filtro lanz\u00F3 una excepci\u00F3n
+filterChain.servlet = La ejecuci\u00F3n del Servlet lanz\u00F3 una excepci\u00F3n
+httpContextMapper.container = Este Contenedor no es un StandardContext
+httpEngineMapper.container = Este Contenedor no es un StandardEngine
+httpHostMapper.container = Esta Contenedor no es una StandardHost
+interceptorValve.alreadyStarted = Ya ha sido arrancada la InterceptorValve
+interceptorValve.notStarted = A\u00FAn no ha sido arrancada la InterceptorValve
+naming.wsdlFailed = No pude hallar fichero wsdl\: {0}
+naming.bindFailed = No pude cambiar (bind) objeto\: {0}
+naming.jmxRegistrationFailed = No pude registrar en JMX\: {0}
+naming.unbindFailed = No pude descambiar (unbind) objecto\: {0}
+naming.invalidEnvEntryType = La entrada de Entorno {0} tiene un tipo inv\u00E1lido
+naming.invalidEnvEntryValue = La entrada de Entorno {0} tiene un valor inv\u00E1lido
+naming.namingContextCreationFailed = Fall\u00F3 la creaci\u00F3n del contexto de nombres (naming)\: {0}
+standardContext.invalidWrapperClass = {0} no es una subclase de StandardWrapper
+standardContext.alreadyStarted = Ya se ha arrancado el Contexto
+standardContext.applicationListener = Error configurando escuchador de aplicaci\u00F3n de clase {0}
+standardContext.applicationSkipped = Se ha saltado la instalaci\u00F3n de escuchadores de aplicaci\u00F3n debido a error(es) previo(s)
+standardContext.badRequest = Trayectoria de requerimiento inv\u00E1lida ({0}).
+standardContext.crlfinurl = El modelo URL "{0}" contiene un CR o LR y por ello nunca coincidir\u00E1.
+standardContext.duplicateListener = El escuchador "{0}" ya est\u00E1 configurado para este contexto. La definici\u00F3n duplicada ha sido ignorada.
+standardContext.errorPage.error = La localizaci\u00F3n de la p\u00E1gina de error 0} debe de comenzar con ''/''
+standardContext.errorPage.required = ErrorPage no puede ser nulo
+standardContext.errorPage.warning = AVISO\: La localizaci\u00F3n de la p\u00E1gina de error {0} debe de comenzar con ''/'' en Servlet 2.4
+standardContext.filterMap.either = El mapeo de filtro debe de especificar o un <url-pattern> o un <servlet-name>
+standardContext.filterMap.name = El mapeo de filtro especifica un nombre desconocido de filtro {0}
+standardContext.filterMap.pattern = <url-pattern> {0} inv\u00E1lido en mapeo de filtro
+standardContext.filterStart = Excepci\u00F3n arrancando filtro {0}
+standardContext.filterStartFailed = No pude arrancar Filtros de aplicaci\u00F3n con \u00E9xito
+standardContext.requestListener.requestInit = Una excepci\u00F3n durante el env\u00EDo de requerimiento ha iniciado un evento de ciclo de vida (lifecycle event) para la instancia de clase a la escucha (listener) {0}
+standardContext.requestListener.requestDestroy = Una excepci\u00F3n durante el env\u00EDo de requerimiento ha destru\u00EDdo un evento de ciclo de vida (lifecycle event) para la instancia de clase a la escucha (listener) {0}
+standardContext.requestListenerStartFailed = No pude arrancar v\u00E1lvula de escuchador de requerimiento con exito
+standardContext.requestListenerConfig.added = A\u00F1adida V\u00E1lvula de escuchador de requerimiento
+standardContext.requestListenerConfig.error = Excepci\u00F3n a\u00F1adiendo V\u00E1lvula de escuchador de requerimiento\: {0}
+standardContext.isUnavailable = Esta aplicaci\u00F3n no est\u00E1 disponible en este momento
+standardContext.listenerStart = Excepci\u00F3n enviando evento inicializado de contexto a instancia de escuchador de clase {0}
+standardContext.listenerStartFailed = No pude arrancar Escuchadores de aplicaci\u00F3n con \u00E9xito
+standardContext.listenerStop = Excepci\u00F3n enviando evento de contexto destru\u00EDdo a instancia de escuchador de clase {0}
+standardContext.loginConfig.errorPage = La P\u00E1gina de error de Formulario {0} debe de comenzar con ''/'
+standardContext.loginConfig.errorWarning = AVISO\: La p\u00E1gina de error de Formulario {0} debe de comenzar con ''/'' en Servlet 2.4
+standardContext.loginConfig.loginPage = La p\u00E1gina de login de Formulario {0} debe de comenzar con ''/'
+standardContext.loginConfig.loginWarning = AVISO\: La p\u00E1gina de login de Formulario {0} debe de comenzar con ''/'' en Servlet 2.4
+standardContext.loginConfig.required = LoginConfig no puede ser nula
+standardContext.mappingError = Error de configuraci\u00F3n de MAPEO para URI relativa {0}
+standardContext.notFound = El recurso requerido ({0}) no se encuentra disponible
+standardContext.notReloadable = Est\u00E1 desactivada la recarga en este Contexto
+standardContext.notStarted = A\u00FAn no se ha arrancado el Contexto
+standardContext.notWrapper = El Hijo de un Contexto debe de ser un Arropador (Wrapper)
+standardContext.parameter.duplicate = Duplicado par\u00E1metro de inicializaci\u00F3n de contexto {0}
+standardContext.parameter.required = Es necesario poner nombre de par\u00E1metro y valor de par\u00E1metro
+standardContext.reloadingCompleted = Se ha completado la Regarga de este Contexto
+standardContext.reloadingFailed = Fall\u00F3 la recarga de este Contexto debido a errores previos
+standardContext.reloadingStarted = Ha comenzado la recarga de este Contexto
+standardContext.resourcesStart = Error arrancando Recursos est\u00E1ticos
+standardContext.securityConstraint.pattern = <url-pattern> {0} inv\u00E1lida en restricci\u00F3n de seguridad
+standardContext.servletMap.name = El mapeo de Servlet especifica un nombre de servlet desconocido {0}
+standardContext.servletMap.pattern = <url-pattern> {0} inv\u00E1lida en mapeo de servlet
+standardContext.startCleanup = Excepci\u00F3n durante la limpieza tras no poder arrancar
+standardContext.startFailed = Fall\u00F3 en arranque del Contexto [{0}] debido a errores previos
+standardContext.startingLoader = Excepci\u00F3n arrancando Cargador
+standardContext.startingManager = Excepci\u00F3n arrancando Gestor
+standardContext.startingWrapper = Excepci\u00F3n arrancando Arropador (Wrapper) para servlet {0}
+standardContext.stoppingContext = Excepci?n parando Context
+standardContext.stoppingLoader = Excepci\u00F3n parando Cargador
+standardContext.stoppingManager = Excepci\u00F3n parando Gestor
+standardContext.stoppingWrapper = Excepci\u00F3n parando Arropador (Wrapper) para servlet {0}
+standardContext.urlDecode = No puedo decodificar URL de trayectoria de requerimiento {0}
+standardContext.urlPattern.patternWarning = AVISO\: el patr\u00F3n URL {0} debe de comenzar con ''/'' en Servlet 2.4
+standardContext.urlValidate = No puedo validar trayectoria de requerimiento de URL decodificada {0}
+standardContext.wrapper.error = El archivo JSP {0} debe de comenzar con ''/'
+standardContext.wrapper.warning = AVISO\: El archivo JSP {0} debe de comenzar con ''/'' en Servlet 2.4
+standardEngine.alreadyStarted = Ya ha sido arrancado el Motor
+standardEngine.mappingError = Error de configuraci\u00F3n de MAPEO para nombre de servidor {0}
+standardEngine.noHost = No hay M\u00E1quina que coincida con nombre de servidor {0}
+standardEngine.noHostHeader = Requerimiento HTTP/1.1 sin M\u00E1quina\: cabecera
+standardEngine.notHost = El Hijo de un Motor debe de ser un M\u00E1quina
+standardEngine.notParent = El Motor no puede tener un Contenedor padre
+standardEngine.notStarted = A\u00FAn no se ha arrancado el Motor
+standardEngine.unfoundHost = M\u00E1quina virtual {0} no hallada
+standardEngine.unknownHost = No se ha especificado m\u00E1quina servidora en este requerimiento
+standardEngine.unregister.mbeans.failed = Error al destruir (destroy()) para fichero mbean {0}
+standardHost.accessBase = No puedo acceder a directorio base de documento {0}
+standardHost.alreadyStarted = Ya ha sido arrancada la M\u00E1quina
+standardHost.appBase = No existe el directorio base de aplicaci\u00F3n {0}
+standardHost.clientAbort = El Cliente Remoto Abort\u00F3 el Requerimiento, IOException\: {0}
+standardHost.configRequired = Es necesario poner la URL a archivo de configuraci\u00F3n
+standardHost.configNotAllowed = No se permite el uso del archivo de configuraci\u00F3n
+standardHost.installBase = S\u00F3lo se pueden instalar aplicaciones web en el directorio de aplicaciones web de M\u00E1quina
+standardHost.installing = Instalando aplicaciones web en trayectoria de contexto {0} desde URL {1}
+standardHost.installingWAR = Instalando aplicaci\u00F3n web desde URL {0}
+standardHost.installingXML = Procesando URL de archivo de configuraci\u00F3n de Contexto {0}
+standardHost.installError = Error desplegando aplicaci\u00F3n en trayectoria de contexto {0}
+standardHost.invalidErrorReportValveClass = No pude cargar clase especifiada de v\u00E1lvula de informe de error\: {0}
+standardHost.docBase = Ya existe el directorio base de documento {0}
+standardHost.mappingError = Error de configuraci\u00F3n de MAPEO para URI de requerimiento {0}
+standardHost.noContext = No se ha configurado Contexto para procesar este requerimiento
+standardHost.noHost = No se ha configurado M\u00E1quina para procesar este requerimiento
+standardHost.notContext = El Hijo de una M\u00E1quina debe de ser un Contexto
+standardHost.notStarted = A\u00FAn no se ha arrancado la M\u00E1quina
+standardHost.nullName = Es necesario poner el nombre de M\u00E1quina
+standardHost.pathFormat = Trayectoria de contexto inv\u00E1lida\: {0}
+standardHost.pathMatch = La trayectoria de Contexto {0} debe de coincidir con el nombre de directorio o de archivo WAR\: {1}
+standardHost.pathMissing = La trayectoria de Contexto {0} no est\u00E1 en uso en este momento
+standardHost.pathRequired = Es necesario poner la trayectoria de Contexto
+standardHost.pathUsed = Ya est\u00E1 en uso la trayectoria de Contexto {0}
+standardHost.removing = Quitando aplicaci\u00F3n web en trayectoria de contexto {0}
+standardHost.removeError = Error quitando aplicaci\u00F3n en trayectoria de contexto {0}
+standardHost.start = Arrancando aplicaci\u00F3n web en trayectoria de contexto {0}
+standardHost.stop = Parando aplicaci\u00F3n web en trayectoria de contexto {0}
+standardHost.unfoundContext = No puedo hallar contexto para URI de requerimiento {0}
+standardHost.warRequired = Es necesario poner la URL a archivo de aplicaci\u00F3n web
+standardHost.warURL = URL inv\u00E1lida para archivo de aplicaci\u00F3n web\: {0}
+standardHost.validationEnabled = Activada la validaci\u00F3n XML
+standardHost.validationDisabled = Desactivada la validaci\u00F3n XML
+standardPipeline.alreadyStarted = Ya se ha arrancado la Tuber\u00EDa (Pipeline)
+standardPipeline.notStarted = No se ha arrancado la Tuber\u00EDa (Pipeline)
+standardPipeline.noValve = No hay m\u00E1s V\u00E1lvulas en la Tuber\u00EDa (Pipeline) procesando este requerimiento
+standardServer.addContainer.ise = No hay conectores disponibles para ser asociados con este contenedor
+standardServer.initialize.initialized = Ya se ha inicializado este servidor
+standardServer.start.connectors = Al menos un conector no est\u00E1 asociado con cualquier contenedor
+standardServer.start.started = Ya ha sido arrancado este servidor
+standardServer.stop.notStarted = A\u00FAn no ha sido arrancado este servidor
+standardService.initialize.initialized = Ya ha sido inicializado este servicio
+standardService.initialize.failed = Servicio inicializando en {0} fall\u00F3
+standardService.register.failed = Error registrando servicio en dominio {0}
+standardService.start.name = Arrancando servicio {0}
+standardService.start.started = Ya ha sido arrancado este sercicio
+standardService.stop.name = Parando servicio {0}
+standardService.stop.notStarted = A\u00FAn no se ha arrancado este servicio
+standardWrapper.allocate = Error reservando espacio para una instancia de servlet
+standardWrapper.allocateException = Excepci\u00F3n de reserva de espacio para servlet {0}
+standardWrapper.containerServlet = Cargando servlet de contenedor {0}
+standardWrapper.createFilters = Excepci\u00F3n de creaci\u00F3n de filtros para servlet {0}
+standardWrapper.deallocateException = Excepci\u00F3n de recuperaci\u00F3n de espacio para servlet {0}
+standardWrapper.destroyException = Servlet.destroy() para servlet {0} lanz\u00F3 excepci\u00F3n
+standardWrapper.exception0 = Informe de Excepci\u00F3n de Tomcat
+standardWrapper.exception1 = Ha tenido lugar una Excepci\u00F3n de Servlet
+standardWrapper.exception2 = Informe de Excepci\u00F3n\:
+standardWrapper.exception3 = Causa Ra\u00EDz\:
+standardWrapper.initException = Servlet.init() para servlet {0} lanz\u00F3 excepci\u00F3n
+standardWrapper.instantiate = Error instanciando clase de servlet {0}
+standardWrapper.isUnavailable = El Servlet {0} no est\u00E1 disponible en este momento
+standardWrapper.jasperLoader = Usando cargador de clases (classloader) de Jasper para servlet {0}
+standardWrapper.jspFile.format = El archivo JSP {0} no comienza con car\u00E1cter ''/''
+standardWrapper.loadException = El Servlet {0} lanz\u00F3 excepci\u00F3n de load()
+standardWrapper.missingClass = El Arropador (Wrapper) no puede hallar clase de servlet {0} o una clase de la que depende
+standardWrapper.missingLoader = El Arropador (Wrapper) no puede hallar Cargador para servlet {0}
+standardWrapper.notChild = El contenedor de Arropador (Wrapper) no puede tener contenedores hijo
+standardWrapper.notClass = No se ha especificado clase de servlet para servlet {0}
+standardWrapper.notContext = El contenedor padre para un Arropador (Wrapper) debe de ser un Contexto
+standardWrapper.notFound = No est\u00E1 disponible el Servlet {0}
+standardWrapper.notServlet = La Clase {0} no es un Servlet
+standardWrapper.privilegedServlet = El Servlet de clase {0} es privilegiado y no puede ser cargado mediante esta aplicaci\u00F3n web
+standardWrapper.releaseFilters = Excepci\u00F3n de Liberaci\u00F3n de filtros para servlet {0}
+standardWrapper.serviceException = Servlet.service() para servlet {0} lanz\u00F3 excepci\u00F3n
+standardWrapper.statusHeader = HTTP Estado {0} - {1}
+standardWrapper.statusTitle = Informe de Error de Tomcat
+standardWrapper.unavailable = Marcando el servlet {0} como no disponible
+standardWrapper.unloadException = El Servlet {0} lanz\u00F3 excepci\u00F3n unload()
+standardWrapper.unloading = No puedo reservar espacio para servlet {0} porque est\u00E1 siendo descargado
+standardWrapper.waiting = Esperando por {0} instancia(s) para recuperar su espacio reservado
+standardWrapper.restrictedServletsResource = No hallado fichero de propiedad de Servlets Restringidos
+applicationFilterConfig.restrictedFiltersResource = No hallado fichero de filtros Restringidos
+applicationFilterConfig.privilegedFilter = El filtro de clase {0} es privilegiado y no puede ser cargado por esta aplicaci\u00F3n web
Modified: trunk/java/org/apache/catalina/loader/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/loader/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/loader/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,31 +1,46 @@
-fileClassLoader.canRead=No se puede leer el Repositorio {0}
-fileClassLoader.exists=No existe el Repositorio {0}
-fileClassLoader.jarFile=No puedo leer archivo JAR {0}
-fileClassLoader.restricted=No puedo cargar clase restringida {0}
-standardLoader.addRepository=A�adiendo repositorio {0}
-standardLoader.alreadyStarted=Ya ha sido arrancado el Cargador
-standardLoader.checkInterval=No puedo poner el intervalo de revisi�n de recarga a {0} segundos
-standardLoader.notContext=No puedo auto-recargar a menos que nuestro Contenedor sea un Contexto
-standardLoader.notReloadabe=La propiedad Recargable est� puesta a falsa
-standardLoader.notStarted=A�n no se ha arrancado el Cargador
-standardLoader.reloadable=No puedo poner la propiedad recargable a {0}
-standardLoader.reloading=Se han activado las revisiones de Recarga para este Contexto
-standardLoader.removeRepository=Quitando repositorio {0}
-standardLoader.starting=Arrancando este Cargador
-standardLoader.stopping=Parando este Cargador
-webappClassLoader.stopped=Acceso ilegal: esta instancia de aplicaci�n web ya ha sido parada. Could not load {0}. La eventual traza de pila que sigue ha sido motivada por un error lanzado con motivos de depuraci�n as� como para intentar terminar el hilo que motiv� el acceso ilegal y no tiene impacto funcional.
-webappLoader.addRepository=A�adiendo repositorio {0}
-webappLoader.deploy=Desplegando repositorios de clase en directorio de trabajo {0}
-webappLoader.jarDeploy=Despliegue del JAR {0} en {1}
-webappLoader.classDeploy=Despliegue de archivos de clase {0} en {1}
-webappLoader.alreadyStarted=Ya se ha arrancado el Cargador
-webappLoader.checkInterval=No puedo poner el intervalo de revisi�n de recarga a {0} segundos
-webappLoader.notContext=No puedo auto-recargar a menos que nuestro Contenedor sea un Contexto
-webappLoader.notReloadabe=Se ha puesto la propiedad Recargable a falsa
-webappLoader.notStarted=A�n no se ha arrancado el Cargador
-webappLoader.reloadable=No puedo poner la propiedad recargable a {0}
-webappLoader.reloading=Se han activado los chequeos de Recarga para este Contexto
-webappLoader.removeRepository=Quitando repositorio {0}
-webappLoader.starting=Arrancando este Cargador
-webappLoader.stopping=Parando este Cargador
-webappLoader.failModifiedCheck=Modificaciones de pista de error
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+fileClassLoader.canRead = No se puede leer el Repositorio {0}
+fileClassLoader.exists = No existe el Repositorio {0}
+fileClassLoader.jarFile = No puedo leer archivo JAR {0}
+fileClassLoader.restricted = No puedo cargar clase restringida {0}
+standardLoader.addRepository = A\u00F1adiendo repositorio {0}
+standardLoader.alreadyStarted = Ya ha sido arrancado el Cargador
+standardLoader.checkInterval = No puedo poner el intervalo de revisi\u00F3n de recarga a {0} segundos
+standardLoader.notContext = No puedo auto-recargar a menos que nuestro Contenedor sea un Contexto
+standardLoader.notReloadabe = La propiedad Recargable est\u00E1 puesta a falsa
+standardLoader.notStarted = A\u00FAn no se ha arrancado el Cargador
+standardLoader.reloadable = No puedo poner la propiedad recargable a {0}
+standardLoader.reloading = Se han activado las revisiones de Recarga para este Contexto
+standardLoader.removeRepository = Quitando repositorio {0}
+standardLoader.starting = Arrancando este Cargador
+standardLoader.stopping = Parando este Cargador
+webappClassLoader.stopped = Acceso ilegal\: esta instancia de aplicaci\u00F3n web ya ha sido parada. Could not load {0}. La eventual traza de pila que sigue ha sido motivada por un error lanzado con motivos de depuraci\u00F3n as\u00ED como para intentar terminar el hilo que motiv\u00F3 el acceso ilegal y no tiene impacto funcional.
+webappClassLoader.wrongVersion = (no puedo cargar clase {0})
+webappLoader.addRepository = A\u00F1adiendo repositorio {0}
+webappLoader.deploy = Desplegando repositorios de clase en directorio de trabajo {0}
+webappLoader.jarDeploy = Despliegue del JAR {0} en {1}
+webappLoader.classDeploy = Despliegue de archivos de clase {0} en {1}
+webappLoader.alreadyStarted = Ya se ha arrancado el Cargador
+webappLoader.checkInterval = No puedo poner el intervalo de revisi\u00F3n de recarga a {0} segundos
+webappLoader.notContext = No puedo auto-recargar a menos que nuestro Contenedor sea un Contexto
+webappLoader.notReloadabe = Se ha puesto la propiedad Recargable a falsa
+webappLoader.notStarted = A\u00FAn no se ha arrancado el Cargador
+webappLoader.reloadable = No puedo poner la propiedad recargable a {0}
+webappLoader.reloading = Se han activado los chequeos de Recarga para este Contexto
+webappLoader.removeRepository = Quitando repositorio {0}
+webappLoader.starting = Arrancando este Cargador
+webappLoader.stopping = Parando este Cargador
+webappLoader.failModifiedCheck = Modificaciones de pista de error
Modified: trunk/java/org/apache/catalina/manager/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/manager/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/manager/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,80 +1,101 @@
-htmlManagerServlet.appsAvailable=Ejecut�ndose
-htmlManagerServlet.appsName=Nombre a Mostrar
-htmlManagerServlet.appsPath=Trayectoria
-htmlManagerServlet.appsReload=Recargar
-htmlManagerServlet.appsUndeploy=Replegar
-htmlManagerServlet.appsSessions=Sesiones
-htmlManagerServlet.appsStart=Arrancar
-htmlManagerServlet.appsStop=Parar
-htmlManagerServlet.appsTasks=Comandos
-htmlManagerServlet.appsTitle=Aplicaciones
-htmlManagerServlet.helpHtmlManager=Ayuda HTML de Gestor
-htmlManagerServlet.helpHtmlManagerFile=html-manager-howto.html
-htmlManagerServlet.helpManager=Ayuda de Gestor
-htmlManagerServlet.helpManagerFile=manager-howto.html
-htmlManagerServlet.deployButton=Desplegar
-htmlManagerServlet.deployConfig=URL de archivo de Configuraci�n XML:
-htmlManagerServlet.deployPath=Trayectoria de Contexto (opcional):
-htmlManagerServlet.deployServer=Desplegar directorio o archivo WAR localizado en servidor
-htmlManagerServlet.deployTitle=Desplegar
-htmlManagerServlet.deployUpload=Archivo WAR a desplegar
-htmlManagerServlet.deployUploadFail=FALLO - Fall� Carga de Despliegue, Excepci�n: {0}
-htmlManagerServlet.deployUploadFile=Seleccione archivo WAR a cargar
-htmlManagerServlet.deployUploadNotWar=FALLO - El archivo cargado \"{0}\" debe de ser un .war
-htmlManagerServlet.deployUploadNoFile=FALLO - Fall� la carga de archivo, no hay archivo
-htmlManagerServlet.deployUploadWarExists=FALLO - El archivo war \"{0}\" ya existe en el servidor
-htmlManagerServlet.deployWar=URL de WAR o Directorio:
-htmlManagerServlet.list=Listar Aplicaciones
-htmlManagerServlet.manager=Gestor
-htmlManagerServlet.messageLabel=Mensaje:
-htmlManagerServlet.serverJVMVendor=Vendedor JVM
-htmlManagerServlet.serverJVMVersion=Versi�n JVM
-htmlManagerServlet.serverOSArch=Arquitectura de SO
-htmlManagerServlet.serverOSName=Nombre de SO
-htmlManagerServlet.serverOSVersion=Versi�n de SO
-htmlManagerServlet.serverTitle=Informaci�n de Servidor
-htmlManagerServlet.serverVersion=Versi�n de Tomcat
-htmlManagerServlet.title=Gestor de Aplicaciones Web de Tomcat
-managerServlet.alreadyContext=FALLO - Ya existe la aplicaci�n en la trayectoria {0}
-managerServlet.alreadyDocBase=FALLO - Directorio {0} ya est� siendo usado
-managerServlet.cannotInvoke=No puedo invocar servlet de gestor a trav�s de invocador
-managerServlet.configured=OK - Desplegada aplicaci�n desde archivo de contexto {0}
-managerServlet.deployed=OK - Desplegada aplicaci�n en trayectoria de contexto {0}
-managerServlet.exception=FALLO - Encontrada excepci�n {0}
-managerServlet.deployed=OK - Desplegada aplicaci�n en trayectoria de contexto {0}
-managerServlet.invalidPath=FALLO - Se ha especificado una trayectoria inv�lida de contexto {0}
-managerServlet.invalidWar=FALLO - Se ha especificado una URL de aplicaci�n inv�lida {0}
-managerServlet.listed=OK - Aplicaciones listadas para m�quinda virutal {0}
-managerServlet.listitem={0}:{1}:{2}:{3}
-managerServlet.noAppBase=FALLO - No puedo identificar aplicaci�n base para trayectoria de contexto {0}
-managerServlet.noCommand=FALLO - No se ha especificado comando
-managerServlet.noContext=FALLO - No existe contexto para trayectoria {0}
-managerServlet.noDirectory=FALLO - Documento base No-directorio para trayectoria {0}
-managerServlet.noDocBase=FALLO - No puedo replegar documento base para trayectoria {0}
-managerServlet.noGlobal=FALLO - No hay disponibles recursos globales JNDI
-managerServlet.noReload=FALLO - Recarga no soportada en WAR desplegado en trayectoria {0}
-managerServlet.noRename=FALLO - No pudeo desplegar WAR cargado para trayectoria {0}
-managerServlet.noRole=FALLO - El usuario no desempe�a el papel de {0}
-managerServlet.noSelf=FALLO - El gestor no puede recargarse, replegarse, pararse o replegarse a s� mismo
-managerServlet.noWrapper=El Contenedor no ha llamado a setWrapper() para este servlet
-managerServlet.reloaded=OK - Recargada aplicaci�n en trayectoria de contexto {0}
-managerServlet.undeployd=OK - Replegada aplicaci�n en trayectoria de contexto {0}
-managerServlet.resourcesAll=OK - Listados recursos globales de todos los tipos
-managerServlet.resourcesType=OK - Listados recursos globales de tipo {0}
-managerServlet.rolesList=OK - Listados papeles de seguridad
-managerServlet.saveFail=FAIL - Fallo al guardar la configuraci�n: {0}
-managerServlet.saved=OK - Configuraci�n de Servidor guardada
-managerServlet.savedContext=OK - Configuraci�n de Contexto {0} guardada
-managerServlet.sessiondefaultmax=Intervalo m�ximo por defecto de sesi�n inactiva {0} minutos
-managerServlet.sessiontimeout={0} minutos: {1} sesiones
-managerServlet.sessions=OK - Informaci�n de sesi�n para aplicaci�n en trayectoria de contexto {0}
-managerServlet.started=OK - Arrancada aplicaci�n en trayectoria de contexto {0}
-managerServlet.startFailed=FALLO - No se pudo arrancar la aplicaci�n en trayectoria de contexto {0}
-managerServlet.stopped=OK - Parada aplicaci�n en trayectoria de contexto {0}
-managerServlet.undeployed=OK - Replegada aplicacaci�n en trayectoria de contexto {0}
-managerServlet.unknownCommand=FALLO - Comando desconocido {0}
-managerServlet.userDatabaseError=FALLO - No puedo resolver referencia de base de datos de usuario
-managerServlet.userDatabaseMissing=FALLO - No se encuentra disponible base de datos de usuario
-
-statusServlet.title=Estado de Servidor
-statusServlet.complete=Estado Completo de Servidor
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+htmlManagerServlet.appsAvailable = Ejecut\u00E1ndose
+htmlManagerServlet.appsName = Nombre a Mostrar
+htmlManagerServlet.appsPath = Trayectoria
+htmlManagerServlet.appsReload = Recargar
+htmlManagerServlet.appsUndeploy = Replegar
+htmlManagerServlet.appsExpire = Expirar sesiones
+htmlManagerServlet.appsSessions = Sesiones
+htmlManagerServlet.appsStart = Arrancar
+htmlManagerServlet.appsStop = Parar
+htmlManagerServlet.appsTasks = Comandos
+htmlManagerServlet.appsTitle = Aplicaciones
+htmlManagerServlet.expire.explain = sin trabajar ≥
+htmlManagerServlet.expire.unit = minutos
+htmlManagerServlet.helpHtmlManager = Ayuda HTML de Gestor
+htmlManagerServlet.helpHtmlManagerFile = html-manager-howto.html
+htmlManagerServlet.helpManager = Ayuda de Gestor
+htmlManagerServlet.helpManagerFile = manager-howto.html
+htmlManagerServlet.deployButton = Desplegar
+htmlManagerServlet.deployConfig = URL de archivo de Configuraci\u00F3n XML\:
+htmlManagerServlet.deployPath = Trayectoria de Contexto (opcional)\:
+htmlManagerServlet.deployServer = Desplegar directorio o archivo WAR localizado en servidor
+htmlManagerServlet.deployTitle = Desplegar
+htmlManagerServlet.deployUpload = Archivo WAR a desplegar
+htmlManagerServlet.deployUploadFail = FALLO - Fall\u00F3 Carga de Despliegue, Excepci\u00F3n\: {0}
+htmlManagerServlet.deployUploadFile = Seleccione archivo WAR a cargar
+htmlManagerServlet.deployUploadInServerXml = FALLO - El fichero war "{0}" no se puede cargar si se define el contexto en server.xml
+htmlManagerServlet.deployUploadNotWar = FALLO - El fichero cargado "{0}" debe de ser un .war
+htmlManagerServlet.deployUploadNoFile = FALLO - Fall\u00F3 la carga del fichero, no hay fichero
+htmlManagerServlet.deployUploadWarExists = FALLO - El fichero war "{0}" ya existe en el servidor
+htmlManagerServlet.deployWar = URL de WAR o Directorio\:
+htmlManagerServlet.list = Listar Aplicaciones
+htmlManagerServlet.manager = Gestor
+htmlManagerServlet.messageLabel = Mensaje\:
+htmlManagerServlet.noManager = -
+htmlManagerServlet.serverJVMVendor = Vendedor JVM
+htmlManagerServlet.serverJVMVersion = Versi\u00F3n JVM
+htmlManagerServlet.serverOSArch = Arquitectura de SO
+htmlManagerServlet.serverOSName = Nombre de SO
+htmlManagerServlet.serverOSVersion = Versi\u00F3n de SO
+htmlManagerServlet.serverTitle = Informaci\u00F3n de Servidor
+htmlManagerServlet.serverVersion = Versi\u00F3n de Tomcat
+htmlManagerServlet.title = Gestor de Aplicaciones Web de Tomcat
+managerServlet.alreadyContext = FALLO - Ya existe la aplicaci\u00F3n en la trayectoria {0}
+managerServlet.alreadyDocBase = FALLO - Directorio {0} ya est\u00E1 siendo usado
+managerServlet.cannotInvoke = No puedo invocar servlet de gestor a trav\u00E9s de invocador
+managerServlet.configured = OK - Desplegada aplicaci\u00F3n desde archivo de contexto {0}
+managerServlet.deployed = OK - Desplegada aplicaci\u00F3n en trayectoria de contexto {0}
+managerServlet.deployFailed = FALLO - No pude desplegar la aplicaci\u00F3n en ruta de contexto {0}
+managerServlet.exception = FALLO - Encontrada excepci\u00F3n {0}
+managerServlet.deployed = OK - Aplicaci\u00F3n desplegada en ruta de contexto {0}
+managerServlet.invalidPath = FALLO - Se ha especificado una trayectoria inv\u00E1lida de contexto {0}
+managerServlet.invalidWar = FALLO - Se ha especificado una URL de aplicaci\u00F3n inv\u00E1lida {0}
+managerServlet.listed = OK - Aplicaciones listadas para m\u00E1quinda virutal {0}
+managerServlet.listitem = {0}\:{1}\:{2}\:{3}
+managerServlet.noAppBase = FALLO - No puedo identificar aplicaci\u00F3n base para trayectoria de contexto {0}
+managerServlet.noCommand = FALLO - No se ha especificado comando
+managerServlet.noContext = FALLO - No existe contexto para trayectoria {0}
+managerServlet.noDirectory = FALLO - Documento base No-directorio para trayectoria {0}
+managerServlet.noDocBase = FALLO - No puedo replegar documento base para trayectoria {0}
+managerServlet.noGlobal = FALLO - No hay disponibles recursos globales JNDI
+managerServlet.noManager = FALLO - No existe gestor para ruta {0}
+managerServlet.noReload = FALLO - Recarga no soportada en WAR desplegado en trayectoria {0}
+managerServlet.noRename = FALLO - No pudeo desplegar WAR cargado para trayectoria {0}
+managerServlet.noRole = FALLO - El usuario no desempe\u00F1a el papel de {0}
+managerServlet.noSelf = FALLO - El gestor no puede recargarse, replegarse, pararse o replegarse a s\u00ED mismo
+managerServlet.noWrapper = El Contenedor no ha llamado a setWrapper() para este servlet
+managerServlet.notDeployed = FALLO - El contexto {0} est\u00E1 definido en server.xml y puede que no est\u00E9 desplegado
+managerServlet.reloaded = OK - Recargada aplicaci\u00F3n en trayectoria de contexto {0}
+managerServlet.undeployd = OK - Replegada aplicaci\u00F3n en trayectoria de contexto {0}
+managerServlet.resourcesAll = OK - Listados recursos globales de todos los tipos
+managerServlet.resourcesType = OK - Listados recursos globales de tipo {0}
+managerServlet.rolesList = OK - Listados papeles de seguridad
+managerServlet.saveFail = FAIL - Fallo al guardar la configuraci\u00F3n\: {0}
+managerServlet.saved = OK - Configuraci\u00F3n de Servidor guardada
+managerServlet.savedContext = OK - Configuraci\u00F3n de Contexto {0} guardada
+managerServlet.sessiondefaultmax = Intervalo m\u00E1ximo por defecto de sesi\u00F3n inactiva {0} minutos
+managerServlet.sessiontimeout = {0} minutos\: {1} sesiones
+managerServlet.sessions = OK - Informaci\u00F3n de sesi\u00F3n para aplicaci\u00F3n en trayectoria de contexto {0}
+managerServlet.started = OK - Arrancada aplicaci\u00F3n en trayectoria de contexto {0}
+managerServlet.startFailed = FALLO - No se pudo arrancar la aplicaci\u00F3n en trayectoria de contexto {0}
+managerServlet.stopped = OK - Parada aplicaci\u00F3n en trayectoria de contexto {0}
+managerServlet.undeployed = OK - Replegada aplicacaci\u00F3n en trayectoria de contexto {0}
+managerServlet.unknownCommand = FALLO - Comando desconocido {0}
+managerServlet.userDatabaseError = FALLO - No puedo resolver referencia de base de datos de usuario
+managerServlet.userDatabaseMissing = FALLO - No se encuentra disponible base de datos de usuario
+statusServlet.title = Estado de Servidor
+statusServlet.complete = Estado Completo de Servidor
Added: trunk/java/org/apache/catalina/manager/host/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/manager/host/LocalStrings_es.properties (rev 0)
+++ trunk/java/org/apache/catalina/manager/host/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -0,0 +1,57 @@
+hostManagerServlet.cannotInvoke = No puedo invocar servlet de gestor de m\u00E1quina a trav\u00E9s del invocador
+hostManagerServlet.noCommand = FALLO - No se ha especificado comando
+hostManagerServlet.unknownCommand = FALLO - Comando desconocido {0}
+hostManagerServlet.noWrapper = El contenedor no ha llamado a setWrapper() para este servlet
+hostManagerServlet.invalidHostName = FALLO - Se ha especificado un nombre inv\u00E1lido de m\u00E1quina {0}
+hostManagerServlet.alreadyHost = FALLO - Ya existe m\u00E1quina con nombre de m\u00E1quina {0}
+hostManagerServlet.managerXml = FALLO - no pude instalar manager.xml
+hostManagerServlet.exception = FALLO - Encontrada excepci\u00F3n {0}
+hostManagerServlet.add = OK - A\u00F1adida m\u00E1quina {0}
+hostManagerServlet.addFailed = FALLO - No pude a\u00F1adir m\u00E1quina {0}
+hostManagerServlet.cannotRemoveOwnHost = FALLO - No puedo quitar m\u00E1quina propia {0}
+hostManagerServlet.remove = OK - Quitada m\u00E1quina {0}
+hostManagerServlet.removeFailed = FALLO - No pude quitar m\u00E1quina {0}
+hostManagerServlet.listed = OK - M\u00E1quinas listadas
+hostManagerServlet.listitem = {0}\:{1}
+hostManagerServlet.cannotStartOwnHost = FALLO - No puedo empezar m\u00E1quina propia {0}
+hostManagerServlet.started = OK - M\u00E1quina {0} arrancada
+hostManagerServlet.startFailed = FALLO - No pude arrancar m\u00E1quina {0}
+hostManagerServlet.cannotStopOwnHost = FALLO - No puedo para m\u00E1quina propia {0}
+hostManagerServlet.stopped = OK - M\u00E1quina {0} parada
+hostManagerServlet.stopFailed = FALLO - No pude parar m\u00E1quina {0}
+htmlHostManagerServlet.title = Gestor de M\u00E1quina Virtual de Tomcat
+htmlHostManagerServlet.messageLabel = Mensaje\:
+htmlHostManagerServlet.manager = Gestor de M\u00E1quina
+htmlHostManagerServlet.list = Lista de M\u00E1quinas Virtuales
+htmlHostManagerServlet.helpHtmlManagerFile = html-host-manager-howto.html
+htmlHostManagerServlet.helpHtmlManager = Ayuda de Gestor de M\u00E1quina HTML (\u00A1En breve\!)
+htmlHostManagerServlet.helpManagerFile = ../docs/host-manager-howto.html
+htmlHostManagerServlet.helpManager = Ayuda de Gestor de M\u00E1quina
+htmlHostManagerServlet.hostName = Nombre de M\u00E1quina
+htmlHostManagerServlet.hostAliases = Aliases de M\u00E1quina
+htmlHostManagerServlet.hostTasks = Comandos
+htmlHostManagerServlet.hostsStart = Iniciar
+htmlHostManagerServlet.hostsStop = Parar
+htmlHostManagerServlet.hostsRemove = Quitar
+htmlHostManagerServlet.addTitle = A\u00F1adir M\u00E1quina Virtual
+htmlHostManagerServlet.addHost = M\u00E1quina
+htmlHostManagerServlet.addName = Nombre\:
+htmlHostManagerServlet.addAliases = Aliases\:
+htmlHostManagerServlet.addAppBase = App base\:
+htmlHostManagerServlet.addManager = App de Gestor
+htmlHostManagerServlet.addAutoDeploy = AutoDeploy
+htmlHostManagerServlet.addDeployOnStartup = DeployOnStartup
+htmlHostManagerServlet.addDeployXML = DeployXML
+htmlHostManagerServlet.addUnpackWARs = UnpackWARs
+htmlHostManagerServlet.addXmlNamespaceAware = XmlNamespaceAware
+htmlHostManagerServlet.addXmlValidation = XmlValidation
+htmlHostManagerServlet.addButton = A\u00F1adir
+htmlHostManagerServlet.serverTitle = Informaci\u00F3n de Servidor
+htmlHostManagerServlet.serverVersion = Versi\u00F3n de Tomcat
+htmlHostManagerServlet.serverJVMVersion = Versi\u00F3n de JVM
+htmlHostManagerServlet.serverJVMVendor = Vendedor JVM
+htmlHostManagerServlet.serverOSName = Nombre de SO
+htmlHostManagerServlet.serverOSVersion = Versi\u00F3n de SO
+htmlHostManagerServlet.serverOSArch = Arquitectura de SO
+statusServlet.title = Estado de Servidor
+statusServlet.complete = Completar Estado de Servidor
Property changes on: trunk/java/org/apache/catalina/manager/host/LocalStrings_es.properties
___________________________________________________________________
Name: svn:executable
+ *
Modified: trunk/java/org/apache/catalina/realm/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/realm/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/realm/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,47 +1,84 @@
+jaasRealm.beginLogin = JAASRealm login requerido para nombre de usuario "{0}" usando LoginContext para aplicaci\u00F3n "{1}"
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
# $Id$
-
# language es
-
# package org.apache.catalina.realm
-
-jaasRealm.accountExpired=El usuario {0} NO ha sido autentificado porque ha expirado su cuenta
-jaasRealm.authenticatedSuccess=El usuario {0} ha sido autentificado con �xito
-jaasRealm.credentialExpired=El usuario {0} NO ha sido autentificado porque ha expirado su credencial
-jaasRealm.failedLogin=El usuario {0} NO ha sido autentificado porque ha fallado el login
-jaasRealm.loginException=Excepci�n de Login autenticando nombre de usuario {0}
-jaasRealm.unexpectedError=Error inesperado
-jdbcRealm.authenticateFailure=El usuario {0} NO ha sido autentificado correctamente
-jdbcRealm.authenticateSuccess=El usuario {0} ha sido autentificado correctamente
-jdbcRealm.close=Excepci�n al cerrar la conexi�n a la base de datos
-jdbcRealm.exception=Excepci�n al realizar la autentificaci�n
-jdbcRealm.open=Excepci�n abriendo la conexi�n a la base de datos
-jndiRealm.authenticateFailure=Autentificaci�n fallida para el usuario {0}
-jndiRealm.authenticateSuccess=Autentificaci�n correcta para el usuario {0}
-jndiRealm.close=Excepci�n al cerrar la conexi�n al servidor de directorio
-jndiRealm.exception=Excepci�n al realizar la autentificaci�n
-jndiRealm.open=Excepci�n al abrir la conexi�n al servidor de directorio
-memoryRealm.authenticateFailure=Autentificaci�n fallida para el usuario {0}
-memoryRealm.authenticateSuccess=Autentificaci�n correcta para el usuario {0}
-memoryRealm.loadExist=El fichero de usuarios {0} no ha podido ser le�do
-memoryRealm.loadPath=Cargando los usuarios desde el fichero {0}
-memoryRealm.readXml=Excepci�n mientras se le�a el fichero de usuarios
-realmBase.algorithm=El algoritmo resumen (digest) {0} es inv�lido
-realmBase.alreadyStarted=Este dominio ya ha sido inicializado
-realmBase.digest=Error procesando las credenciales del usuario
-realmBase.forbidden=El acceso al recurso pedido ha sido denegado
-realmBase.hasRoleFailure=El usuario {0} NO desempe�a el papel de {1}
-realmBase.hasRoleSuccess=El usuario {0} desempe�a el papel de {1}
-realmBase.notAuthenticated=Error de Configuraci�n: No se pueden realizar funciones de control de acceso sin un principal autentificado
-realmBase.notStarted=Este dominio a�n no ha sido inicializado
-realmBase.authenticateFailure=Nombre de usuario {0} NO autenticado con �xito
-realmBase.authenticateSuccess=Nombre de usuario {0} autenticado con �xito
-userDatabaseRealm.authenticateError=Error de configuraci�n de Login autenticando nombre de usuario {0}
-userDatabaseRealm.lookup=Excepci�n buscando en Base de datos de Usuario mediante la clave {0}
-userDatabaseRealm.noDatabase=No se ha hallado componente de Base de datos de Usuario mediante la clave {0}
-userDatabaseRealm.noEngine=No se ha hallado componente de Motor en jerarqu�a de contenedor
-userDatabaseRealm.noGlobal=No se ha hallado contexto de recursos globales JNDI
-dataSourceRealm.authenticateFailure=Nombre de usuario {0} NO autenticado con �xito
-dataSourceRealm.authenticateSuccess=Nombre de usuario {0} autenticado con �xito
-dataSourceRealm.close=Excepci�n cerrando conexi�n a base de datos
-dataSourceRealm.exception=Excepci�n realizando autenticaci�n
-dataSourceRealm.open=Excepci�n abriendo conexi�n a base de datos
+jaasRealm.accountExpired = El usuario {0} NO ha sido autentificado porque ha expirado su cuenta
+jaasRealm.authenticateFailure = Nombre de usuario "{0}" NO autenticado con \u00E9xito
+jaasRealm.authenticateSuccess = Nombre de usuario "{0}" autenticado con \u00E9xito como Principal "{1}" -- Tambi\u00E9n se ha creado el Asunto
+jaasRealm.credentialExpired = El usuario {0} NO ha sido autentificado porque ha expirado su credencial
+jaasRealm.failedLogin = El usuario {0} NO ha sido autentificado porque ha fallado el login
+jaasRealm.loginException = Excepci\u00F3n de Login autenticando nombre de usuario {0}
+jaasRealm.unexpectedError = Error inesperado
+jaasRealm.loginContextCreated = JAAS LoginContext creado para nombre de usuario "{0}"
+jaasRealm.userPrincipalSuccess = El asunto para el nombre de usuario "{0}" devolvi\u00F3 usuario Principal "{1}"
+jaasRealm.userPrincipalFailure = El asunto para el nombre de usuario "{0}" no devolvi\u00F3 un usuario Principal v\u00E1lido
+jaasRealm.cachePrincipal = Usuario Principal "{0}" en cach\u00E9; tiene {1} papel de Principal
+jaasRealm.checkPrincipal = Revisando Principal "{0}" [{1}]
+jaasRealm.userPrincipalSuccess = El Principal "{0}" es una clase v\u00E1lida de usuario. La vamos a usar como usuario Principal.
+jaasRealm.userPrincipalFailure = No se ha hallado usuario Principal
+jaasRealm.rolePrincipalAdd = A\u00F1adiend papel Principal "{0}" a los papeles de este usuario Principal
+jaasRealm.rolePrincipalSuccess = hallado {0} papeles de Principal
+jaasRealm.rolePrincipalFailure = No se han hallado papeles de Principal v\u00E1lidos.
+jaasRealm.isInRole.start = Revisando si el usuario Principal "{0}" tiene el papel "{1}"
+jaasRealm.isInRole.noPrincipalOrRole = No se han hallado papeles de Principal. El usuario Principal o el Asunto es nulo o el usuario Principal no est\u00E1 en cach\u00E9
+jaasRealm.isInRole.principalCached = El Usuario Principal tiene {0} papeles de Principal
+jaasRealm.isInRole.possessesRole = El Usuario Principal tiene un papele de Principal llamado "{0}"
+jaasRealm.isInRole.match = Hallado papel de Principal coincidente.
+jaasRealm.isInRole.noMatch = NO hallado papel de Principal coincidente.
+jaasCallback.digestpassword = Resumida contrase\u00F1a "{0}" como "{1}"
+jaasCallback.username = Devuelto nombre de usuario "{0}"
+jaasCallback.password = Devuelta contrase\u00F1a "{0}"
+jdbcRealm.authenticateFailure = El usuario {0} NO ha sido autentificado correctamente
+jdbcRealm.authenticateSuccess = El usuario {0} ha sido autentificado correctamente
+jdbcRealm.close = Excepci\u00F3n al cerrar la conexi\u00F3n a la base de datos
+jdbcRealm.exception = Excepci\u00F3n al realizar la autentificaci\u00F3n
+jdbcRealm.getPassword.exception = Excepci\u00F3n recuperando contrase\u00F1a para "{0}"
+jdbcRealm.getRoles.exception = Excepci\u00F3n recuperando papeles para "{0}"
+jdbcRealm.open = Excepci\u00F3n abriendo la conexi\u00F3n a la base de datos
+jndiRealm.authenticateFailure = Autentificaci\u00F3n fallida para el usuario {0}
+jndiRealm.authenticateSuccess = Autentificaci\u00F3n correcta para el usuario {0}
+jndiRealm.close = Excepci\u00F3n al cerrar la conexi\u00F3n al servidor de directorio
+jndiRealm.exception = Excepci\u00F3n al realizar la autentificaci\u00F3n
+jndiRealm.open = Excepci\u00F3n al abrir la conexi\u00F3n al servidor de directorio
+memoryRealm.authenticateFailure = Autentificaci\u00F3n fallida para el usuario {0}
+memoryRealm.authenticateSuccess = Autentificaci\u00F3n correcta para el usuario {0}
+memoryRealm.loadExist = El fichero de usuarios {0} no ha podido ser le\u00EDdo
+memoryRealm.loadPath = Cargando los usuarios desde el fichero {0}
+memoryRealm.readXml = Excepci\u00F3n mientras se le\u00EDa el fichero de usuarios
+realmBase.algorithm = El algoritmo resumen (digest) {0} es inv\u00E1lido
+realmBase.alreadyStarted = Este dominio ya ha sido inicializado
+realmBase.digest = Error procesando las credenciales del usuario
+realmBase.forbidden = El acceso al recurso pedido ha sido denegado
+realmBase.hasRoleFailure = El usuario {0} NO desempe\u00F1a el papel de {1}
+realmBase.hasRoleSuccess = El usuario {0} desempe\u00F1a el papel de {1}
+realmBase.notAuthenticated = Error de Configuraci\u00F3n\: No se pueden realizar funciones de control de acceso sin un principal autentificado
+realmBase.notStarted = Este dominio a\u00FAn no ha sido inicializado
+realmBase.authenticateFailure = Nombre de usuario {0} NO autenticado con \u00E9xito
+realmBase.authenticateSuccess = Nombre de usuario {0} autenticado con \u00E9xito
+userDatabaseRealm.authenticateError = Error de configuraci\u00F3n de Login autenticando nombre de usuario {0}
+userDatabaseRealm.lookup = Excepci\u00F3n buscando en Base de datos de Usuario mediante la clave {0}
+userDatabaseRealm.noDatabase = No se ha hallado componente de Base de datos de Usuario mediante la clave {0}
+userDatabaseRealm.noEngine = No se ha hallado componente de Motor en jerarqu\u00EDa de contenedor
+userDatabaseRealm.noGlobal = No se ha hallado contexto de recursos globales JNDI
+dataSourceRealm.authenticateFailure = Nombre de usuario {0} NO autenticado con \u00E9xito
+dataSourceRealm.authenticateSuccess = Nombre de usuario {0} autenticado con \u00E9xito
+dataSourceRealm.close = Excepci\u00F3n cerrando conexi\u00F3n a base de datos
+dataSourceRealm.exception = Excepci\u00F3n realizando autenticaci\u00F3n
+dataSourceRealm.getPassword.exception = Excepci\u00F3n recuperando contrase\u00F1a para "{0}"
+dataSourceRealm.getRoles.exception = Excepci\u00F3n recuperando papeles para "{0}"
+dataSourceRealm.open = Excepci\u00F3n abriendo conexi\u00F3n a base de datos
+jaasRealm.authenticatedSuccess = El usuario {0} ha sido autentificado con \u00E9xito
Modified: trunk/java/org/apache/catalina/security/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/security/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/security/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,2 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
SecurityUtil.doAsPrivilege=Ha tenido lugar una excepci�n al ejecutar el bloque PrivilegedExceptionAction.
Modified: trunk/java/org/apache/catalina/servlets/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/servlets/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/servlets/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,18 +1,33 @@
-defaultservlet.directorylistingfor=Listado de Directorio para:
-defaultservlet.upto=Atr�s a:
-defaultservlet.subdirectories=Subdirectorios:
-defaultservlet.files=Archivos:
-invokerServlet.allocate=No puedo reservar espacio para instancia de servlet para trayectoria {0}
-invokerServlet.cannotCreate=No puedo crear arropador (wrapper) de servlet para trayectoria {0}
-invokerServlet.deallocate=No puedo recuperar instancia de servlet para trayectoria {0}
-invokerServlet.invalidPath=No se ha especificado nombre de servlet o clase en trayectoria {0}
-invokerServlet.notNamed=No puedo llamar a servlet invocador mediante un despachador nombrado (named)
-invokerServlet.noWrapper=El Contenedor no ha llamado a setWrapper() para este servlet
-webdavservlet.jaxpfailed=Fall� la inicializaci�n de JAXP
-directory.filename=Nombre de Archivo
-directory.lastModified=�ltima Modificaci�n
-directory.parent=Atr�s A {0}
-directory.size=Medida
-directory.title=Listado de Directorio Para {0}
-directory.version=Tomcat Catalina versi�n 4.0
-
+defaultServlet.missingResource = El recurso requerido {0} no se encuentra disponible
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+defaultservlet.directorylistingfor = Listado de Directorio para\:
+defaultservlet.upto = Atr\u00E1s a\:
+defaultservlet.subdirectories = Subdirectorios\:
+defaultservlet.files = Archivos\:
+invokerServlet.allocate = No puedo reservar espacio para instancia de servlet para trayectoria {0}
+invokerServlet.cannotCreate = No puedo crear arropador (wrapper) de servlet para trayectoria {0}
+invokerServlet.deallocate = No puedo recuperar instancia de servlet para trayectoria {0}
+invokerServlet.invalidPath = No se ha especificado nombre de servlet o clase en trayectoria {0}
+invokerServlet.notNamed = No puedo llamar a servlet invocador mediante un despachador nombrado (named)
+invokerServlet.noWrapper = El Contenedor no ha llamado a setWrapper() para este servlet
+webdavservlet.jaxpfailed = Fall\u00F3 la inicializaci\u00F3n de JAXP
+webdavservlet.enternalEntityIgnored = El requerimiento inclu\u00EDa una referencia a una entidad externa con PublicID {0} y SystemID {1} que fue ignorada
+directory.filename = Nombre de Archivo
+directory.lastModified = \u00DAltima Modificaci\u00F3n
+directory.parent = Atr\u00E1s A {0}
+directory.size = Medida
+directory.title = Listado de Directorio Para {0}
+directory.version = Tomcat Catalina versi\u00F3n 4.0
Modified: trunk/java/org/apache/catalina/session/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/session/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/session/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,66 +1,81 @@
-applicationSession.session.ise=estado inv�lido de sesi�n
-applicationSession.value.iae=valor nulo
-fileStore.alreadyStarted=Ya ha sido arrancado el Almac�n de Archivos
-fileStore.notStarted=A�n no se ha arrancado el Almac�n de Archivos
-fileStore.saving=Salvando Sesi�n {0} en archivo {1}
-fileStore.loading=Cargando Sesi�n {0} desde archivo {1}
-fileStore.removing=Quitando Sesi�n {0} en archivo {1}
-JDBCStore.alreadyStarted=Ya ha sido arrancado el Almac�n JDBC
-JDBCStore.close=Excepci�n cerrando conexi�n a base de datos {0}
-JDBCStore.notStarted=A�n no se ha arrancado el Almac�n JDBC
-JDBCStore.saving=Salvando Sesi�n {0} en base de datos {1}
-JDBCStore.loading=Cargando Sesi�n {0} desde base de datos {1}
-JDBCStore.removing=Quitando Sesi�n {0} en base de datos {1}
-JDBCStore.SQLException=Error SQL {0}
-JDBCStore.checkConnectionDBClosed=La conexi�na a base de datos es nula o est� cerrada. Intentando reabrirla.
-JDBCStore.checkConnectionDBReOpenFail=Fall� la reapertura de la base de datos. Puede que la base de datos est� ca�da.
-JDBCStore.checkConnectionSQLException=Ha tenido lugar una excepci�n SQL {0}
-JDBCStore.checkConnectionClassNotFoundException=No se ha hallado la clase del manejador (driver) JDBC {0}
-managerBase.complete=Se ha completado la siembra del generador de n�meros aleatorios
-managerBase.getting=Obteniendo mensaje de componente de resumen (digest) para algoritmo {0}
-managerBase.gotten=Completada la obtenci�n de mensaje de componente de resumen (digest)
-managerBase.random=Excepci�n inicializando generador de n�meros aleatorios de clase {0}
-managerBase.seeding=Sembrando clase de generador de n�meros aleatorios {0}
-serverSession.value.iae=valor nulo
-standardManager.alreadyStarted=Ya ha sido arrancado el Gestor
-standardManager.createSession.ise=createSession: Demasiadas sesiones activas
-standardManager.expireException=processsExpire: Excepci�n durante la expiraci�n de sesi�n
-standardManager.loading=Cargando sesiones persistidas desde {0}
-standardManager.loading.cnfe=ClassNotFoundException al cargar sesiones persistidas: {0}
-standardManager.loading.ioe=IOException al cargar sesiones persistidas: {0}
-standardManager.notStarted=A�n no se ha arrancado el Gestor
-standardManager.sessionTimeout=Valor inv�lido de Tiempo Agotado de sesi�n {0}
-standardManager.unloading=Salvando sesiones persistidas a {0}
-standardManager.unloading.ioe=IOException al salvar sesiones persistidas: {0}
-standardManager.managerLoad=Excepci�n cargando sesiones desde almacenamiento persistente
-standardManager.managerUnload=Excepci�n descargando sesiones a almacenamiento persistente
-standardSession.attributeEvent=El escuchador de eventos de atributo de Sesi�n lanz� una excepci�n
-standardSession.invalidate.ise=invalidate: La Sesi�n ya ha sido invalidada
-standardSession.isNew.ise=isNew: La Sesi�n ya ha sido invalidada
-standardSession.getAttribute.ise=getAttribute: La Sesi�n ya ha sido invalidada
-standardSession.getAttributeNames.ise=getAttributeNames: La Sesi�n ya ha sido invalidada
-standardSession.getCreationTime.ise=getCreationTime: La Sesi�n ya ha sido invalidada
-standardSession.getLastAccessedTime.ise=getLastAccessedTime: La Sesi�n ya ha sido invalidada
-standardSession.getId.ise=getId: La Sesi�n ya ha sido invalidada
-standardSession.getMaxInactiveInterval.ise=getMaxInactiveInterval: La Sesi�n ya ha sido invalidada
-standardSession.getValueNames.ise=getValueNames: La Sesi�n ya ha sido invalidada
-standardSession.notSerializable=No puedo serializar atributo de sesi�n {0} para sesi�n {1}
-standardSession.removeAttribute.ise=removeAttribute: La Sesi�n ya ha sido invalidada
-standardSession.sessionEvent=El escuchador de evento de Sesi�n lanz� una execpci�n
-standardSession.setAttribute.iae=setAttribute: Atributo no serializable
-standardSession.setAttribute.ise=setAttribute: La Sesi�n ya ha sido invalidada
-standardSession.setAttribute.namenull=setAttribute: el nuevo par�metro no puede ser nulo
-standardSession.sessionCreated=Creada Sesi�n id = {0}
-persistentManager.loading=Cargando {0} sesiones persistidas
-persistentManager.unloading=Salvando {0} sesiones persistidas
-persistentManager.expiring=Expirando {0} sesiones antes de salvarlas
-persistentManager.deserializeError=Error des-serializando Sesi�n {0}: {1}
-persistentManager.serializeError=Error serializando Sesi�n {0}: {1}
-persistentManager.swapMaxIdle=Intercambiando sesi�n {0} a fuera a Almac�n, ociosa durante {1} segundos
-persistentManager.backupMaxIdle=Respaldando sesi�n {0} a Almac�n, ociosa durante {1} segundos
-persistentManager.backupException=Ha tenido lugar una excepci�n al respaldar la Sesi�n {0}: {1}
-persistentManager.tooManyActive=Demasiadas sesiones activas, {0}, buscando sesiones ociosas para intercambiar
-persistentManager.swapTooManyActive=Intercambiando sesi�n {0} a fuera, ociosa durante {1} segundos: Demasiadas sesiones activas
-persistentManager.processSwaps=Mirando qu� sesiones intercambiar a fuera, {0} sesiones activas en memoria
-persistentManager.activeSession=La sesi�n {0} ha estado ociosa durante {1} segundos
-persistentManager.swapIn=Intercambiando sesi�n {0} a dentro desde Almac�n
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+applicationSession.session.ise = estado inv\u00E1lido de sesi\u00F3n
+applicationSession.value.iae = valor nulo
+fileStore.alreadyStarted = Ya ha sido arrancado el Almac\u00E9n de Archivos
+fileStore.notStarted = A\u00FAn no se ha arrancado el Almac\u00E9n de Archivos
+fileStore.saving = Salvando Sesi\u00F3n {0} en archivo {1}
+fileStore.loading = Cargando Sesi\u00F3n {0} desde archivo {1}
+fileStore.removing = Quitando Sesi\u00F3n {0} en archivo {1}
+JDBCStore.alreadyStarted = Ya ha sido arrancado el Almac\u00E9n JDBC
+JDBCStore.close = Excepci\u00F3n cerrando conexi\u00F3n a base de datos {0}
+JDBCStore.notStarted = A\u00FAn no se ha arrancado el Almac\u00E9n JDBC
+JDBCStore.saving = Salvando Sesi\u00F3n {0} en base de datos {1}
+JDBCStore.loading = Cargando Sesi\u00F3n {0} desde base de datos {1}
+JDBCStore.removing = Quitando Sesi\u00F3n {0} en base de datos {1}
+JDBCStore.SQLException = Error SQL {0}
+JDBCStore.checkConnectionDBClosed = La conexi\u00F3na a base de datos es nula o est\u00E1 cerrada. Intentando reabrirla.
+JDBCStore.checkConnectionDBReOpenFail = Fall\u00F3 la reapertura de la base de datos. Puede que la base de datos est\u00E9 ca\u00EDda.
+JDBCStore.checkConnectionSQLException = Ha tenido lugar una excepci\u00F3n SQL {0}
+JDBCStore.checkConnectionClassNotFoundException = No se ha hallado la clase del manejador (driver) JDBC {0}
+managerBase.complete = Se ha completado la siembra del generador de n\u00FAmeros aleatorios
+managerBase.getting = Obteniendo mensaje de componente de resumen (digest) para algoritmo {0}
+managerBase.gotten = Completada la obtenci\u00F3n de mensaje de componente de resumen (digest)
+managerBase.random = Excepci\u00F3n inicializando generador de n\u00FAmeros aleatorios de clase {0}
+managerBase.seeding = Sembrando clase de generador de n\u00FAmeros aleatorios {0}
+serverSession.value.iae = valor nulo
+standardManager.alreadyStarted = Ya ha sido arrancado el Gestor
+standardManager.createSession.ise = createSession\: Demasiadas sesiones activas
+standardManager.expireException = processsExpire\: Excepci\u00F3n durante la expiraci\u00F3n de sesi\u00F3n
+standardManager.loading = Cargando sesiones persistidas desde {0}
+standardManager.loading.cnfe = ClassNotFoundException al cargar sesiones persistidas\: {0}
+standardManager.loading.ioe = IOException al cargar sesiones persistidas\: {0}
+standardManager.notStarted = A\u00FAn no se ha arrancado el Gestor
+standardManager.sessionTimeout = Valor inv\u00E1lido de Tiempo Agotado de sesi\u00F3n {0}
+standardManager.unloading = Salvando sesiones persistidas a {0}
+standardManager.unloading.ioe = IOException al salvar sesiones persistidas\: {0}
+standardManager.managerLoad = Excepci\u00F3n cargando sesiones desde almacenamiento persistente
+standardManager.managerUnload = Excepci\u00F3n descargando sesiones a almacenamiento persistente
+standardSession.attributeEvent = El oyente de eventos de atributo de Sesi\u00F3n lanz\u00F3 una excepci\u00F3n
+standardSession.bindingEvent = El oyente de eventos de ligado de Sesi\u00F3n lanz\u00F3 una excepci\u00F3n
+standardSession.invalidate.ise = invalidate\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.isNew.ise = isNew\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.getAttribute.ise = getAttribute\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.getAttributeNames.ise = getAttributeNames\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.getCreationTime.ise = getCreationTime\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.getLastAccessedTime.ise = getLastAccessedTime\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.getId.ise = getId\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.getMaxInactiveInterval.ise = getMaxInactiveInterval\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.getValueNames.ise = getValueNames\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.notSerializable = No puedo serializar atributo de sesi\u00F3n {0} para sesi\u00F3n {1}
+standardSession.removeAttribute.ise = removeAttribute\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.sessionEvent = El oyente de evento de Sesi\u00F3n lanz\u00F3 una execpci\u00F3n
+standardSession.setAttribute.iae = setAttribute\: Atributo no serializable
+standardSession.setAttribute.ise = setAttribute\: La Sesi\u00F3n ya ha sido invalidada
+standardSession.setAttribute.namenull = setAttribute\: el nuevo par\u00E1metro no puede ser nulo
+standardSession.sessionCreated = Creada Sesi\u00F3n id \= {0}
+persistentManager.loading = Cargando {0} sesiones persistidas
+persistentManager.unloading = Salvando {0} sesiones persistidas
+persistentManager.expiring = Expirando {0} sesiones antes de salvarlas
+persistentManager.deserializeError = Error des-serializando Sesi\u00F3n {0}\: {1}
+persistentManager.serializeError = Error serializando Sesi\u00F3n {0}\: {1}
+persistentManager.swapMaxIdle = Intercambiando sesi\u00F3n {0} a fuera a Almac\u00E9n, ociosa durante {1} segundos
+persistentManager.backupMaxIdle = Respaldando sesi\u00F3n {0} a Almac\u00E9n, ociosa durante {1} segundos
+persistentManager.backupException = Ha tenido lugar una excepci\u00F3n al respaldar la Sesi\u00F3n {0}\: {1}
+persistentManager.tooManyActive = Demasiadas sesiones activas, {0}, buscando sesiones ociosas para intercambiar
+persistentManager.swapTooManyActive = Intercambiando sesi\u00F3n {0} a fuera, ociosa durante {1} segundos\: Demasiadas sesiones activas
+persistentManager.processSwaps = Mirando qu\u00E9 sesiones intercambiar a fuera, {0} sesiones activas en memoria
+persistentManager.activeSession = La sesi\u00F3n {0} ha estado ociosa durante {1} segundos
+persistentManager.swapIn = Intercambiando sesi\u00F3n {0} a dentro desde Almac\u00E9n
Modified: trunk/java/org/apache/catalina/startup/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/startup/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/startup/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,61 +1,94 @@
-contextConfig.applicationClose=Error durante el cierre del archivo web.xml de la aplicaci�n
-contextConfig.applicationConfig=Error de configuraci�n en el archivo web.xml de la aplicaci�n
-contextConfig.applicationListener=Excepci�n durante la creaci�n de la clase de escucha (listener) {0}
-contextConfig.applicationMissing=Falta el archivo web.xml de la aplicaci�n. Utilizando los par�metros por defecto
-contextConfig.applicationParse=Error de evaluaci�n (parse) en el archivo web.xml de la aplicaci�n a {0}
-contextConfig.applicationPosition=Se ha producido en la l�nea {0} columna {1}
-contextConfig.authenticatorConfigured=Configuraci�n de un autentificador (authenticator) para el m�todo {0}
-contextConfig.authenticatorInstantiate=Imposible de instanciar un autenticador (authenticator) para la clase {0}
-contextConfig.authenticatorMissing=Imposible de configurar un autentificador (authenticator) para el m�todo {0}
-contextConfig.authenticatorResources=Imposible de cargar la lista de correspondencia de autenticadores (authenticators)
-contextConfig.cce=El objeto de los datos de evento de ciclo de vida (Lifecycle event data object) {0} no es un Contexto
-contextConfig.certificatesConfig.added=Adici�n de certificados -> requiere v�lvula de atributo (attribute Valve)
-contextConfig.certificatesConfig.error=Excepci�n durante la adici�n de "CertificatesValve":
-contextConfig.defaultClose=Error durante el cierre del archivo web.xml por defecto
-contextConfig.defaultConfig=Error de configuraci�n en el archivo web.xml por defecto
-contextConfig.defaultMissing=Falta el archivo web.xml por defecto, utilizando s�lo el archivo web.xml de la aplicaci�n
-contextConfig.defaultParse=Error de evaluaci�n (parse) en el arcivo web.xml por defecto
-contextConfig.defaultPosition=Se ha producido en la l�nea {0} columna {1}
-contextConfig.missingRealm=Alg�n reino (realm) no ha sido configurado para realizar la autenticaci�n
-contextConfig.role.auth=ATENCI�N: El nombre de papel de seguridad {0} es usado en un <auth-constraint> sin haber sido definido en <security-role>
-contextConfig.role.link=ATENCI�N: El nombre de papel de seguridad {0} es usado en un <role-link> sin haber sido definido en <security-role>
-contextConfig.role.runas=ATENCI�N: El nombre de papel de seguridad {0} es usado en un <run-as> sin haber sido definido en <security-role>
-contextConfig.start="ContextConfig": Tratamiento del "START"
-contextConfig.stop="ContextConfig": Tratamiento del "STOP"
-contextConfig.tldEntryException=Excepci�n durante el tratamiento de la TLD {0} en el JAR indicado por la trayectoria de recurso {1} en contexto {2}
-contextConfig.tldFileException=Excepci�n durante el tratamiento de la TLD indicada por la trayectoria de recurso {0} en contexto {1}
-contextConfig.tldJarException=Excepci�n durante el tratamiento del JAR indicado por la trayectoria de recurso {0} en contexto {1}
-contextConfig.tldResourcePath=Trayectoria de recurso TLD {0} inv�lida
-contextConfig.unavailable=Esta aplicaci�n est� marcada como no disponible debido a los errores precedentes
-embedded.alreadyStarted=El servicio embebido (embedded service) ya ha sido arrancado
-embedded.noEngines=Alg�n motor (engine) no ha sido a�n definido
-embedded.notStarted=El servicio embebido (embedded service) a�n no ha sido arrancado
-engineConfig.cce=El objeto de los datos de evento de ciclo de vida (Lifecycle event data object) {0} no es un motor (engine)
-engineConfig.start="EngineConfig": Tratamiento del "START"
-engineConfig.stop="EngineConfig": Tratamiento del "STOP"
-hostConfig.appBase=No existe el directorio base de la aplicaci�n {0}
-hostConfig.cce=El objeto de los datos de evento de ciclo de vida (Lifecycle event data object) {0} no es una m�quina (host)
-hostConfig.deploy=Desplieque del directorio {0} de la aplicaci�n web
-hostConfig.deployDescriptor=Desplieque del descriptor de configuraci�n {0}
-hostConfig.deployDescriptor.error=Error durante el despliegue del descriptor de configuraci�n {0}
-hostConfig.deployDir=Despliegue del directorio {0} de la aplicaci�n web
-hostConfig.deployDir.error=Error durante el despliegue del directorio {0} de la aplicaci�n web
-hostConfig.deployJar=Despliegue del archivo {0} de la aplicaci�n web
-hostConfig.deployJar.error=Error durante el despliegue del archivo {0} de la aplicaci�n web
-hostConfig.deploy.error=Excepci�n en el directorio {0} de la aplicaci�n web
-hostConfig.deploying=Desplegando aplicaciones web descubiertas
-hostConfig.expand=Descompresi�n del archivo {0} de la aplicaci�n web
-hostConfig.expand.error=Excepci�n durante la descompresi�n del archivo {0} de la aplicaci�n web
-hostConfig.expanding=Descubierta descompresi�n de archivos de aplicaciones web
-hostConfig.context.restart=Error durante el arranque del contexto {0}
-hostConfig.start="HostConfig": Tratamiento del "START"
-hostConfig.stop="HostConfig": Tratamiento del "STOP"
-hostConfig.undeploy=Repliegue (undeploy) de la aplicaci�n web que tiene como trayectoria de contexto {0}
-hostConfig.undeploy.error=Error durante el repliegue (undeploy) de la aplicaci�n web que tiene como trayectoria de contexto {0}
-hostConfig.undeploying=Repliegue de las aplicaciones web desplegadas
-userConfig.database=Excepci�n durante la carga de base de datos de usuario
-userConfig.deploy=Despliegue de la aplicaci�n web para el usuario {0}
-userConfig.deploying=Desplegando aplicaciones web para el usuario
-userConfig.error=Error durante el despliegue de la aplicaci�n web para el usario {0}
-userConfig.start="UserConfig": Tratamiento del "START"
-userConfig.stop="UserConfig": Tratamiento del "STOP"
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+contextConfig.applicationClose = Error durante el cierre del archivo web.xml de la aplicaci\u00F3n
+contextConfig.applicationConfig = Error de configuraci\u00F3n en el archivo web.xml de la aplicaci\u00F3n
+contextConfig.applicationListener = Excepci\u00F3n durante la creaci\u00F3n de la clase de escucha (listener) {0}
+contextConfig.applicationMissing = Falta el archivo web.xml de la aplicaci\u00F3n. Utilizando los par\u00E1metros por defecto
+contextConfig.applicationParse = Error de evaluaci\u00F3n (parse) en el archivo web.xml de la aplicaci\u00F3n a {0}
+contextConfig.applicationPosition = Se ha producido en la l\u00EDnea {0} columna {1}
+contextConfig.authenticatorConfigured = Configuraci\u00F3n de un autentificador (authenticator) para el m\u00E9todo {0}
+contextConfig.authenticatorInstantiate = Imposible de instanciar un autenticador (authenticator) para la clase {0}
+contextConfig.authenticatorMissing = Imposible de configurar un autentificador (authenticator) para el m\u00E9todo {0}
+contextConfig.authenticatorResources = Imposible de cargar la lista de correspondencia de autenticadores (authenticators)
+contextConfig.cce = El objeto de los datos de evento de ciclo de vida (Lifecycle event data object) {0} no es un Contexto
+contextConfig.certificatesConfig.added = Adici\u00F3n de certificados -> requiere v\u00E1lvula de atributo (attribute Valve)
+contextConfig.certificatesConfig.error = Excepci\u00F3n durante la adici\u00F3n de "CertificatesValve"\:
+contextConfig.contextClose = Error cerrando context.xml\: {0}
+contextConfig.contextMissing = Falta context.xml\: {0}
+contextConfig.contextParse = Error de an\u00E1lisis en context.xml\: {0}
+contextConfig.defaultClose = Error durante el cierre del archivo web.xml por defecto
+contextConfig.defaultConfig = Error de configuraci\u00F3n en el archivo web.xml por defecto
+contextConfig.defaultMissing = Falta el archivo web.xml por defecto, utilizando s\u00F3lo el archivo web.xml de la aplicaci\u00F3n
+contextConfig.defaultParse = Error de evaluaci\u00F3n (parse) en el arcivo web.xml por defecto
+contextConfig.defaultPosition = Se ha producido en la l\u00EDnea {0} columna {1}
+contextConfig.fixDocBase = Excepci\u00F3n arreglando docBase\: {0}
+contextConfig.init = ContextConfig\: Inicializando
+contextConfig.missingRealm = Alg\u00FAn reino (realm) no ha sido configurado para realizar la autenticaci\u00F3n
+contextConfig.role.auth = ATENCI\u00D3N\: El nombre de papel de seguridad {0} es usado en un <auth-constraint> sin haber sido definido en <security-role>
+contextConfig.role.link = ATENCI\u00D3N\: El nombre de papel de seguridad {0} es usado en un <role-link> sin haber sido definido en <security-role>
+contextConfig.role.runas = ATENCI\u00D3N\: El nombre de papel de seguridad {0} es usado en un <run-as> sin haber sido definido en <security-role>
+contextConfig.start = "ContextConfig"\: Tratamiento del "START"
+contextConfig.stop = "ContextConfig"\: Tratamiento del "STOP"
+contextConfig.tldEntryException = Excepci\u00F3n durante el tratamiento de la TLD {0} en el JAR indicado por la trayectoria de recurso {1} en contexto {2}
+contextConfig.tldFileException = Excepci\u00F3n durante el tratamiento de la TLD indicada por la trayectoria de recurso {0} en contexto {1}
+contextConfig.tldJarException = Excepci\u00F3n durante el tratamiento del JAR indicado por la trayectoria de recurso {0} en contexto {1}
+contextConfig.tldResourcePath = Trayectoria de recurso TLD {0} inv\u00E1lida
+contextConfig.unavailable = Esta aplicaci\u00F3n est\u00E1 marcada como no disponible debido a los errores precedentes
+contextConfig.altDDNotFound = fichero alt-dd {0} no hallado
+embedded.alreadyStarted = El servicio embebido (embedded service) ya ha sido arrancado
+embedded.noEngines = Alg\u00FAn motor (engine) no ha sido a\u00FAn definido
+embedded.notmp = No puedo hallar carpeta temporal especificada en {0}
+embedded.notStarted = El servicio embebido (embedded service) a\u00FAn no ha sido arrancado
+embedded.authenticatorNotInstanceOfValve = El Autenticado especificado no es un V\u00E1lvula
+engineConfig.cce = El objeto de los datos de evento de ciclo de vida (Lifecycle event data object) {0} no es un motor (engine)
+engineConfig.start = "EngineConfig"\: Tratamiento del "START"
+engineConfig.stop = "EngineConfig"\: Tratamiento del "STOP"
+expandWar.copy = Error copiando {0} a {1}
+hostConfig.appBase = No existe el directorio base de la aplicaci\u00F3n {0}
+hostConfig.canonicalizing = Error al borrar redespliegue de recursos desde contexto [{0}]
+hostConfig.cce = El objeto de los datos de evento de ciclo de vida (Lifecycle event data object) {0} no es una m\u00E1quina (host)
+hostConfig.context.destroy = Error al destruir contexto [{0}]
+hostConfig.context.remove = Error al quitar contexto [{0}]
+hostConfig.context.restart = Error durante el arranque del contexto {0}
+hostConfig.deploy = Desplieque del directorio {0} de la aplicaci\u00F3n web
+hostConfig.deployDescriptor = Desplieque del descriptor de configuraci\u00F3n {0}
+hostConfig.deployDescriptor.error = Error durante el despliegue del descriptor de configuraci\u00F3n {0}
+hostConfig.deployDescriptor.localDocBaseSpecified = Se ha especificado un docBase {0} dentro del appBase de la m\u00E1quina y ser\u00E1 ignorado
+hostConfig.deployDir = Despliegue del directorio {0} de la aplicaci\u00F3n web
+hostConfig.deployDir.error = Error durante el despliegue del directorio {0} de la aplicaci\u00F3n web
+hostConfig.deployJar = Despliegue del archivo {0} de la aplicaci\u00F3n web
+hostConfig.deployJar.error = Error durante el despliegue del archivo {0} de la aplicaci\u00F3n web
+hostConfig.deploy.error = Excepci\u00F3n en el directorio {0} de la aplicaci\u00F3n web
+hostConfig.deploying = Desplegando aplicaciones web descubiertas
+hostConfig.expand = Descompresi\u00F3n del archivo {0} de la aplicaci\u00F3n web
+hostConfig.expand.error = Excepci\u00F3n durante la descompresi\u00F3n del archivo {0} de la aplicaci\u00F3n web
+hostConfig.expanding = Descubierta descompresi\u00F3n de archivos de aplicaciones web
+hostConfig.jmx.register = Fall\u00F3 el registro del contexto [{0}]
+hostConfig.jmx.unregister = Fall\u00F3 el desregistro del contexto [{0}]
+hostConfig.reload = Fall\u00F3 la recarga del contexto [{0}]
+hostConfig.removeXML = El context [{0}] est\u00E1 replegado
+hostConfig.removeDIR = El directorio [{0}] est\u00E1 replegado
+hostConfig.removeWAR = El War [{0}] est\u00E1 replegado
+hostConfig.start = "HostConfig"\: Tratamiento del "START"
+hostConfig.stop = "HostConfig"\: Tratamiento del "STOP"
+hostConfig.undeploy = Repliegue (undeploy) de la aplicaci\u00F3n web que tiene como trayectoria de contexto {0}
+hostConfig.undeploy.error = Error durante el repliegue (undeploy) de la aplicaci\u00F3n web que tiene como trayectoria de contexto {0}
+hostConfig.undeploying = Repliegue de las aplicaciones web desplegadas
+userConfig.database = Excepci\u00F3n durante la carga de base de datos de usuario
+userConfig.deploy = Despliegue de la aplicaci\u00F3n web para el usuario {0}
+userConfig.deploying = Desplegando aplicaciones web para el usuario
+userConfig.error = Error durante el despliegue de la aplicaci\u00F3n web para el usario {0}
+userConfig.start = "UserConfig"\: Tratamiento del "START"
+userConfig.stop = "UserConfig"\: Tratamiento del "STOP"
Modified: trunk/java/org/apache/catalina/util/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/util/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/util/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,10 +1,24 @@
-parameterMap.locked=No se permiten modificaciones en un ParameterMap bloqueado
-resourceSet.locked=No se permiten modificaciones en un ResourceSet bloqueado
-hexUtil.bad=D�gito hexadecimal incorrecto
-hexUtil.odd=N�mero de d�gitos hexadecimales impar
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+parameterMap.locked = No se permiten modificaciones en un ParameterMap bloqueado
+resourceSet.locked = No se permiten modificaciones en un ResourceSet bloqueado
+hexUtil.bad = D\u00EDgito hexadecimal incorrecto
+hexUtil.odd = N\u00FAmero de d\u00EDgitos hexadecimales impar
#Default Messages Utilized by the ExtensionValidator
-extensionValidator.web-application-manifest=Manifiesto de Aplicaci�n Web
-extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]: La extensi�n no encuentra el "{2}" requerido.
-extensionValidator.extension-validation-error=ExtensionValidator[{0}]: Imposible de hallar la(s) extension(es) {1} requerida(s).
-SecurityUtil.doAsPrivilege=Una excepci�n se ha producido durante la ejecuci�n del bloque PrivilegedExceptionAction.
-
+extensionValidator.web-application-manifest = Manifiesto de Aplicaci\u00F3n Web
+extensionValidator.extension-not-found-error = ExtensionValidator[{0}][{1}]\: La extensi\u00F3n no encuentra el "{2}" requerido.
+extensionValidator.extension-validation-error = ExtensionValidator[{0}]\: Imposible de hallar la(s) extension(es) {1} requerida(s).
+extensionValidator.failload = No pude cargar la extensi\u00F3n {0}
+SecurityUtil.doAsPrivilege = Una excepci\u00F3n se ha producido durante la ejecuci\u00F3n del bloque PrivilegedExceptionAction.
Modified: trunk/java/org/apache/catalina/valves/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/catalina/valves/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/catalina/valves/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,67 +1,83 @@
-accessLogValve.alreadyStarted=El Registrador de accesos ya se hab�a iniciado
-accessLogValve.notStarted=El Registrador de accesos no se ha iniciado
-certificatesValve.alreadyStarted=La v�lvula de certificados ya se hab�a iniciado
-certificatesValve.notStarted=La v�lvula de certificados no se ha iniciado
-interceptorValve.alreadyStarted=La v�lvula interceptora ya se hab�a iniciado
-interceptorValve.notStarted=La v�lvula interceptora no se ha iniciado
-requestFilterValve.next=No hay ''siguiente'' v�lvula configurada
-requestFilterValve.syntax=Error de sint�xis en petici�n de filtro patr�n {0}
-valveBase.noNext=Error de configuraci�n: No hay ''siguiente'' v�lvula configurada
-jdbcAccessLogValve.exception=Excepci�n realizando entrada de acceso a inserci�n
-jdbcAccessLogValve.close=Excepci�n cerrando conexi�n a base de datos
-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+accessLogValve.alreadyStarted = El Registrador de accesos ya se hab\u00EDa iniciado
+accessLogValve.notStarted = El Registrador de accesos no se ha iniciado
+semaphoreValve.alreadyStarted = La v\u00E1lvula del sem\u00E1foro ya ha sido arrancada
+semaphoreValve.notStarted = La v\u00E1lvula del sem\u00E1foro a\u00FAn no ha sido arrancada
+certificatesValve.alreadyStarted = La v\u00E1lvula de certificados ya se hab\u00EDa iniciado
+certificatesValve.notStarted = La v\u00E1lvula de certificados no se ha iniciado
+interceptorValve.alreadyStarted = La v\u00E1lvula interceptora ya se hab\u00EDa iniciado
+interceptorValve.notStarted = La v\u00E1lvula interceptora no se ha iniciado
+requestFilterValve.next = No hay ''siguiente'' v\u00E1lvula configurada
+requestFilterValve.syntax = Error de sint\u00E1xis en petici\u00F3n de filtro patr\u00F3n {0}
+valveBase.noNext = Error de configuraci\u00F3n\: No hay ''siguiente'' v\u00E1lvula configurada
+jdbcAccessLogValve.exception = Excepci\u00F3n realizando entrada de acceso a inserci\u00F3n
+jdbcAccessLogValve.close = Excepci\u00F3n cerrando conexi\u00F3n a base de datos
+cometConnectionManagerValve.event = Excepci\u00F3n procesando evento
+cometConnectionManagerValve.listenerEvent = Excepci\u00F3n procesando evento de oyente de sesi\u00F3n
# Error report valve
-errorReportValve.errorReport=Informe de Error
-errorReportValve.statusHeader=Estado HTTP {0} - {1}
-errorReportValve.exceptionReport=Informe de Excepci�n
-errorReportValve.statusReport=Informe de estado
-errorReportValve.message=mensaje
-errorReportValve.description=descripci�n
-errorReportValve.exception=excepci�n
-errorReportValve.rootCause=causa ra�z
-errorReportValve.note=nota
-errorReportValve.rootCauseInLogs=La traza completa de la causa de este error se encuentra en los archivos de diario de {0}.
-
+errorReportValve.errorReport = Informe de Error
+errorReportValve.statusHeader = Estado HTTP {0} - {1}
+errorReportValve.exceptionReport = Informe de Excepci\u00F3n
+errorReportValve.statusReport = Informe de estado
+errorReportValve.message = mensaje
+errorReportValve.description = descripci\u00F3n
+errorReportValve.exception = excepci\u00F3n
+errorReportValve.rootCause = causa ra\u00EDz
+errorReportValve.note = nota
+errorReportValve.rootCauseInLogs = La traza completa de la causa de este error se encuentra en los archivos de diario de {0}.
# HTTP status reports
-http.100=El cliente puede continuar ({0}).
-http.101=El servidor est� conmutando protocolos con arreglo a la cabecera "Upgrade" ({0}).
-http.201=El requerimiento tuvo �xito y un nuevo recurso ({0}) ha sido creado en el servidor.
-http.202=Este requerimiento ha sido aceptado para ser procesado, pero no ha sido completado ({0}).
-http.203=La informaci�n meta presentada por el cliente no se origin� desde el servidor ({0}).
-http.204=El requerimiento tuvo �xito pero no hay informaci�n que devolver ({0}).
-http.205=El cliente no deber�a de limpiar la vista del documento que caus� que este requerimiento fuera enviado ({0}).
-http.206=El servidor ha rellenado paci�lmente un requerimiento GET para este recurso ({0}).
-http.207=Se han devuelto valores m�ltiples de estado ({0}).
-http.300=El recurso requerido ({0}) corresponde a una cualquiera de un conjunto de representaciones, cada una con su propia localizaci�n espec�fica.
-http.301=El recurso requerido ({0}) ha sido movido perman�ntemente a una nueva localizaci�n.
-http.302=El recurso requerido ({0}) ha sido movido tempor�lmente a una nueva localizaci�n.
-http.303=La respuesta a este requerimiento se puede hallar bajo una URI diferente ({0}).
-http.304=El recurso requerido ({0}) est� disponible y no ha sido modificado.
-http.305=El recurso requerido ({0}) debe de ser accedido a trav�s del apoderado (proxy) dado mediante la cabecera "Location".
-http.400=El requerimiento enviado por el cliente era sint�cticamente incorrecto ({0}).
-http.401=Este requerimiento requiere autenticaci�n HTTP ({0}).
-http.402=Se requiere pago para acceder a este recurso ({0}).
-http.403=El acceso al recurso especificado ({0}) ha sido prohibido.
-http.404=El recurso requerido ({0}) no est� disponible.
-http.405=El m�todo HTTP especificado no est� permitido para el recurso requerido ({0}).
-http.406=El recurso identificado por este requerimiento s�lo es capaz de generar respuestas con caracter�sticas no aceptables con arreglo a las cabeceras "accept" de requerimiento ({0}).
-http.407=El cliente debe de ser primero autenticado en el apoderado ({0}).
-http.408=El cliente no produjo un requerimiento dentro del tiempo en que el servidor estaba preparado esperando ({0}).
-http.409=El requerimiento no pudo ser completado debido a un conflicto con el estado actual del recurso ({0}).
-http.410=El recurso requerido ({0}) ya no est� disponible y no se conoce direcci�n de reenv�o.
-http.411=Este requerimiento no puede ser manejado sin un tama�o definido de contenido ({0}).
-http.412=Una precondici�n especificada ha fallado para este requerimiento ({0}).
-http.413=La entidad de requerimiento es mayor de lo que el servidor quiere o puede procesar.
-http.414=El servidor rechaz� este requerimiento porque la URI requerida era demasiado larga ({0}).
-http.415=El servidor rechaz� este requerimiento porque la entidad requerida se encuentra en un formato no soportado por el recurso requerido para el m�todo requerido ({0}).
-http.416=El rango de byte requerido no puede ser satisfecho ({0}).
-http.417=Lo que se espera dado por la cabecera "Expect" de requerimiento ({0}) no pudo ser completado.
-http.422=El servidor entendi� el tipo de contenido y la sint�xis del requerimiento pero no pudo procesar las instrucciones contenidas ({0}).
-http.423=La fuente o recurso de destino de un m�todo est� bloqueada ({0}).
-http.500=El servidor encontr� un error interno ({0}) que hizo que no pudiera rellenar este requerimiento.
-http.501=El servidor no soporta la funcionalidad necesaria para rellenar este requerimiento ({0}).
-http.502=Este servidor recibi� una respuesta inv�lida desde un servidor que consult� cuando actuaba como apoderado o pasarela ({0}).
-http.503=El servicio requerido ({0}) no est� disponible en este momento.
-http.504=El servidor recibi� un Tiempo Agotado desde un servidor superior cuando actuaba como pasarela o apoderado ({0}).
-http.505=El servidor no soporta la versi�n de protocolo HTTP requerida ({0}).
-http.507=El recurso no tiene espacio suficiente para registrar el estado del recurso tras la ejecuci�n de este m�todo ({0}).
+http.100 = El cliente puede continuar ({0}).
+http.101 = El servidor est\u00E1 conmutando protocolos con arreglo a la cabecera "Upgrade" ({0}).
+http.201 = El requerimiento tuvo \u00E9xito y un nuevo recurso ({0}) ha sido creado en el servidor.
+http.202 = Este requerimiento ha sido aceptado para ser procesado, pero no ha sido completado ({0}).
+http.203 = La informaci\u00F3n meta presentada por el cliente no se origin\u00F3 desde el servidor ({0}).
+http.204 = El requerimiento tuvo \u00E9xito pero no hay informaci\u00F3n que devolver ({0}).
+http.205 = El cliente no deber\u00EDa de limpiar la vista del documento que caus\u00F3 que este requerimiento fuera enviado ({0}).
+http.206 = El servidor ha rellenado paci\u00E1lmente un requerimiento GET para este recurso ({0}).
+http.207 = Se han devuelto valores m\u00FAltiples de estado ({0}).
+http.300 = El recurso requerido ({0}) corresponde a una cualquiera de un conjunto de representaciones, cada una con su propia localizaci\u00F3n espec\u00EDfica.
+http.301 = El recurso requerido ({0}) ha sido movido perman\u00E9ntemente a una nueva localizaci\u00F3n.
+http.302 = El recurso requerido ({0}) ha sido movido tempor\u00E1lmente a una nueva localizaci\u00F3n.
+http.303 = La respuesta a este requerimiento se puede hallar bajo una URI diferente ({0}).
+http.304 = El recurso requerido ({0}) est\u00E1 disponible y no ha sido modificado.
+http.305 = El recurso requerido ({0}) debe de ser accedido a trav\u00E9s del apoderado (proxy) dado mediante la cabecera "Location".
+http.400 = El requerimiento enviado por el cliente era sint\u00E1cticamente incorrecto ({0}).
+http.401 = Este requerimiento requiere autenticaci\u00F3n HTTP ({0}).
+http.402 = Se requiere pago para acceder a este recurso ({0}).
+http.403 = El acceso al recurso especificado ({0}) ha sido prohibido.
+http.404 = El recurso requerido ({0}) no est\u00E1 disponible.
+http.405 = El m\u00E9todo HTTP especificado no est\u00E1 permitido para el recurso requerido ({0}).
+http.406 = El recurso identificado por este requerimiento s\u00F3lo es capaz de generar respuestas con caracter\u00EDsticas no aceptables con arreglo a las cabeceras "accept" de requerimiento ({0}).
+http.407 = El cliente debe de ser primero autenticado en el apoderado ({0}).
+http.408 = El cliente no produjo un requerimiento dentro del tiempo en que el servidor estaba preparado esperando ({0}).
+http.409 = El requerimiento no pudo ser completado debido a un conflicto con el estado actual del recurso ({0}).
+http.410 = El recurso requerido ({0}) ya no est\u00E1 disponible y no se conoce direcci\u00F3n de reenv\u00EDo.
+http.411 = Este requerimiento no puede ser manejado sin un tama\u00F1o definido de contenido ({0}).
+http.412 = Una precondici\u00F3n especificada ha fallado para este requerimiento ({0}).
+http.413 = La entidad de requerimiento es mayor de lo que el servidor quiere o puede procesar.
+http.414 = El servidor rechaz\u00F3 este requerimiento porque la URI requerida era demasiado larga ({0}).
+http.415 = El servidor rechaz\u00F3 este requerimiento porque la entidad requerida se encuentra en un formato no soportado por el recurso requerido para el m\u00E9todo requerido ({0}).
+http.416 = El rango de byte requerido no puede ser satisfecho ({0}).
+http.417 = Lo que se espera dado por la cabecera "Expect" de requerimiento ({0}) no pudo ser completado.
+http.422 = El servidor entendi\u00F3 el tipo de contenido y la sint\u00E1xis del requerimiento pero no pudo procesar las instrucciones contenidas ({0}).
+http.423 = La fuente o recurso de destino de un m\u00E9todo est\u00E1 bloqueada ({0}).
+http.500 = El servidor encontr\u00F3 un error interno ({0}) que hizo que no pudiera rellenar este requerimiento.
+http.501 = El servidor no soporta la funcionalidad necesaria para rellenar este requerimiento ({0}).
+http.502 = Este servidor recibi\u00F3 una respuesta inv\u00E1lida desde un servidor que consult\u00F3 cuando actuaba como apoderado o pasarela ({0}).
+http.503 = El servicio requerido ({0}) no est\u00E1 disponible en este momento.
+http.504 = El servidor recibi\u00F3 un Tiempo Agotado desde un servidor superior cuando actuaba como pasarela o apoderado ({0}).
+http.505 = El servidor no soporta la versi\u00F3n de protocolo HTTP requerida ({0}).
+http.507 = El recurso no tiene espacio suficiente para registrar el estado del recurso tras la ejecuci\u00F3n de este m\u00E9todo ({0}).
Added: trunk/java/org/apache/coyote/ajp/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/coyote/ajp/LocalStrings_es.properties (rev 0)
+++ trunk/java/org/apache/coyote/ajp/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -0,0 +1,24 @@
+ajpprotocol.endpoint.initerror = Error inicializando punto final
+ajpprotocol.endpoint.starterror = Error arrancando punto final
+ajpprotocol.init = Inicializando Coyote AJP/1.3 en {0}
+ajpprotocol.proto.error = Error leyendo requerimiento, ignorado
+ajpprotocol.getattribute = Atributo {0}
+ajpprotocol.setattribute = Atributo {0}\: {1}
+ajpprotocol.start = Arrancando Coyote AJP/1.3 en {0}
+ajpprotocol.stop = Parando Coyote AJP/1.3 en {0}
+ajpprotocol.pause = Pausando Coyote AJP/1.3 en {0}
+ajpprotocol.endpoint.pauseerror = Error pausando punto final
+ajpprotocol.resume = Retomando Coyote AJP/1.3 en {0}
+ajpprotocol.endpoint.resumeerror = Error retomando punto final
+ajpprotocol.failedread = Fallo en lectura de Conector
+ajpprotocol.failedwrite = Fallo en escritura de Conector
+ajpprotocol.request.register = Error registrando procesador de requerimiento en JMX
+ajpprocessor.header.error = Fallo en an\u00E1lisis de mensaje de cabecera
+ajpprocessor.request.prepare = Error preparando requerimiento
+ajpprocessor.request.process = Error procesando requerimiento
+ajpprocessor.certs.fail = Fallo en conversi\u00F3n de Certificado
+ajpprocessor.socket.info = Excepci\u00F3n obteniendo informaci\u00F3n de conector
+ajpmessage.null = No puedo a\u00F1adir valor nulo
+ajpmessage.overflow = Error de desbordamiento en b\u00FAfer al a\u00F1adir {0} bytes en posici\u00F3n {1}
+ajpmessage.read = Los {0} bytes requeridos exceden los datos disponibles de mensaje
+ajpmessage.invalid = Mensaje inv\u00E1lido recibido con firma {0}
Property changes on: trunk/java/org/apache/coyote/ajp/LocalStrings_es.properties
___________________________________________________________________
Name: svn:executable
+ *
Modified: trunk/java/org/apache/coyote/http11/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/coyote/http11/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/coyote/http11/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,34 +1,54 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
# $Id$
-
# language es
-
# package org.apache.coyote.http11
-
#
# Http11Protocol
+http11protocol.endpoint.initerror = Error inicializando punto final (endpoint)
+http11protocol.endpoint.starterror = Error arrancando punto final (endpoint)
+http11protocol.init = Inicializando Coyote HTTP/1.1 en puerto {0}
+http11protocol.proto.error = Error leyendo requerimiento, ignorado
+http11protocol.proto.ioexception.debug = IOException leyendo requerimiento
+http11protocol.proto.ioexception.info = IOException leyendo requerimiento, ignorada
+http11protocol.proto.socketexception.debug = SocketException leyendo requerimiento
+http11protocol.proto.socketexception.info = SocketException leyendo requerimiento, ignorada
+http11protocol.getattribute = Atributo {0}
+http11protocol.setattribute = Atributo {0}\: {1}
+http11protocol.socketfactory.initerror = Error inicializando f\u00E1brica de enchufes (sockets)
+http11protocol.start = Arrancando Coyote HTTP/1.1 en puerto {0}
+http11protocol.stop = Parando Coyote HTTP/1.1 en puerto {0}
+http11protocol.pause = Pausando Coyote HTTP/1.1 en puerto {0}
+http11protocol.endpoint.pauseerror = Error al pausar punto final
+http11protocol.resume = Retomando Coyote HTTP/1.1 en {0}
+http11protocol.endpoint.resumeerror = Error al retomar punto final
+http11processor.regexp.error = Error al analizar expresi\u00F3n regular {0}
+http11processor.filter.unknown = Filtro desconocido {0}
+http11processor.filter.error = Error inicializando filtro {0}
+http11processor.header.parse = Error analizando cabecera de requerimiento HTTP
+http11processor.request.prepare = Error preparando requerimiento
+http11processor.request.process = Error procesando requerimiento
+http11processor.request.finish = Error acabando requerimiento
+http11processor.response.finish = Error acabando respuesta
+http11processor.socket.info = Excepci\u00F3n obteniendo informaci\u00F3n de conector
+http11processor.socket.ssl = Excepci\u00F3n obteniendo atributos SSL
+http11processor.socket.timeout = Error poniendo tiempo agotado para conector
#
-
-http11protocol.endpoint.initerror=Error inicializando punto final (endpoint)
-http11protocol.endpoint.starterror=Error arrancando punto final (endpoint)
-http11protocol.init=Inicializando Coyote HTTP/1.1 en puerto {0}
-http11protocol.proto.error=Error leyendo requerimiento, ignorado
-http11protocol.proto.ioexception.debug=IOException leyendo requerimiento
-http11protocol.proto.ioexception.info=IOException leyendo requerimiento, ignorada
-http11protocol.proto.socketexception.debug=SocketException leyendo requerimiento
-http11protocol.proto.socketexception.info=SocketException leyendo requerimiento, ignorada
-http11protocol.getattribute=Atributo {0}
-http11protocol.setattribute=Atributo {0}: {1}
-http11protocol.socketfactory.initerror=Error inicializando f�brica de enchufes (sockets)
-http11protocol.start=Arrancando Coyote HTTP/1.1 en puerto {0}
-
-#
# Http11Processor
#
-
#
# InternalInputBuffer
-#
-
-iib.eof.error=Inesperado Fin De Archivo (EOF) le�do en el enchufe (socket)
-iib.requestheadertoolarge.error=La cabecera del requerimiento es demasido grande
-
+iib.eof.error = Inesperado Fin De Archivo (EOF) le\u00EDdo en el enchufe (socket)
+iib.requestheadertoolarge.error = La cabecera del requerimiento es demasido grande
Added: trunk/java/org/apache/el/Messages_es.properties
===================================================================
--- trunk/java/org/apache/el/Messages_es.properties (rev 0)
+++ trunk/java/org/apache/el/Messages_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -0,0 +1,27 @@
+error.convert = No puedo convertir {0} desde tipo {1} a {2}
+error.compare = No puedo comparar {0} con {1}
+error.function = Problemas llamando a funci\u00F3n ''{0}''
+error.unreachable.base = Objetivo inalcanzable, identificador ''{0}'' resuelto a nulo
+error.unreachable.property = Objetivo inalcanzable, ''{0}'' devolvi\u00F3 nulo
+error.resolver.unhandled = ELResolver no manej\u00F3 el tipo\: {0} con propiedad de ''{1}''
+error.resolver.unhandled.null = ELResolver no puede manejar un Objeto base nulo con identificador de ''{0}''
+error.value.literal.write = ValueExpression es un literal y no un grabable\: {0}
+error.null = La expresi\u00F3n no puede ser nula
+error.mixed = La expresi\u00F3n no puede contenera la vez '\#{..}' y '${..}' \: {0}
+error.method = No es una MethodExpression v\u00E1lida\: {0}
+error.method.nullParms = Los tipos de par\u00E1metro no pueden ser nulo
+error.value.expectedType = El tipo esperado no puede ser nulo
+error.eval = Error Evaluando {0} \: {1}
+error.syntax.set = Sit\u00E1xis ilegal para Operaci\u00F3n de Poner Valor
+error.method.notfound = M\u00E9todo no hallado\: {0}.{1}({2})
+error.property.notfound = Propiedad ''{1}'' no hallada en {0}
+error.fnMapper.null = La expresi\u00F3n usa funciones, pero no se ha suministrado FunctionMapper
+error.fnMapper.method = Funci\u00F3n "{0}" no hallada
+error.fnMapper.paramcount = La funci\u00F3n ''{0}'' especifica {1} par\u00E9metros, pero {2} fueron declarados
+error.context.null = ELContext era nulo
+error.array.outofbounds = \u00CDndice {0} fuera de l\u00EDmites para arreglo de medida {1}
+error.list.outofbounds = \u00CDndice {0} fuera de l\u00EDmites para lista de medida {1}
+error.property.notfound = Propiedad ''{1}'' no hallada en tipo\: {0}
+error.property.invocation = Propiedad ''{1}'' lanz\u00F3 una excepci\u00F3n desde tipo\: {0}
+error.property.notreadable = La propiedad ''{1}'' no tiene un 'get' especificado en el tipo\: {0}
+error.property.notwritable = La propiedad ''{1}'' no tiene un 'set' especificado en el tipo\: {0}
Property changes on: trunk/java/org/apache/el/Messages_es.properties
___________________________________________________________________
Name: svn:executable
+ *
Modified: trunk/java/org/apache/jasper/resources/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/jasper/resources/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/jasper/resources/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,3 +1,18 @@
+jsp.error.compiler = No hay compilador Java disponible
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
# $Id$
#
# Default localized string information
@@ -2,405 +17,438 @@
# Localized para Locale es_ES
-
-jsp.error.bad.servlet.engine=�Versi�n incorrecta del motor servlet!
-jsp.error.no.scratch.dir=El motor JSP no tiene configurado un directorio de trabajo.\
-\n A�ada \"jsp.initparams=scratchdir=<dir-name>\" \
-\n en el fichero servlets.properties para este contexto.
-jsp.error.bad.scratch.dir=El directorio de trabajo especificado: {0} no es utilizable.
-jsp.message.scratch.dir.is=El directorio de trabajo para el motor JSP es: {0}
-jsp.message.parent_class_loader_is=El cargador de clases es: {0}
-jsp.message.dont.modify.servlets=IMPORTANTE: No modifique los servlets generados
-jsp.error.not.impl.comments=Error Interno: Comments no implementado
-jsp.error.not.impl.directives=Error Interno: Directives no implementado
-jsp.error.not.impl.declarations=Error Interno: Declarations no implementado
-jsp.error.not.impl.expressions=Error Interno: Expressions no implementado
-jsp.error.not.impl.scriptlets=Error Interno: Scriptlets no implementado
-jsp.error.not.impl.useBean=Error Interno: useBean no implementado
-jsp.error.not.impl.getp=Error Interno: getProperty no implementado
-jsp.error.not.impl.setp=Error Interno: setProperty no implementado
-jsp.error.not.impl.plugin=Error Interno: plugin no implementado
-jsp.error.not.impl.forward=Error Interno: forward no implementado
-jsp.error.not.impl.include=Error Interno: include no implementado
-jsp.error.unavailable=JSP ha sido marcado como no disponible
-jsp.error.usebean.missing.attribute=useBean: falta atributo id o est� mal digitado
-jsp.error.usebean.missing.type=useBean ({0}): Se debe de especificar atributo class o type:
-jsp.error.usebean.duplicate=useBean: Nombre de bean duplicado: {0}
-jsp.error.usebean.prohibited.as.session=No puedo usar como bean de sesi�n {0} ya que est� prohibido \
-por directiva jsp definida previamente:
-jsp.error.usebean.not.both=useBean: No puede especificar ambos atributos class y beanName:
-jsp.error.usebean.bad.type.cast=useBean ({0}): Tipo ({1}) no es asignable desde clase ({2})
-jsp.error.invalid.scope=Valor ilegal de atributo \'scope\': {0} (debe de ser uno de \"page\", \"request\", \"session\", o \"application\")
-jsp.error.classname=No pude determinar el nombre de clase desde el fichero .class
-jsp.warning.bad.type=Aviso: tipo incorrecto en archivo .class
-jsp.error.data.file.write=Error mientras escrib�a el archivo de datos
-jsp.error.page.invalid.buffer=Directiva Page: medida de buffer inv�lida
-jsp.error.page.conflict.contenttype=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'contentType' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.invalid.contenttype=Directiva Page: valor incorrecto para contentType
-jsp.error.page.conflict.session=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'session' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.invalid.session=Directiva Page: valor incorrecto para session
-jsp.error.page.conflict.buffer=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'buffer'con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.invalid.buffer=Directiva Page: valor incorrecto para buffer
-jsp.error.page.conflict.autoflush=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'autoFlush' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.invalid.autoflush==Directiva Page: valor incorrecto para autoFlush
-jsp.error.page.conflict.isthreadsafe=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'isThreadSafe' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.invalid.isthreadsafe==Directiva Page: valor incorrecto para isThreadSafe
-jsp.error.page.conflict.info=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'info' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.invalid.info==Directiva Page: valor incorrecto para info
-jsp.error.page.conflict.iserrorpage=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'isErrorPage' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.invalid.iserrorpage==Directiva Page: valor incorrecto para isErrorPage
-jsp.error.page.conflict.errorpage=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'errorPage' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.conflict.language=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'language' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.tag.conflict.language=Directiva Tag: es ilegal tener m�ltiples ocurrencias de 'language' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.language.nonjava=Directiva Page: atributo language incorrecto
-jsp.error.tag.language.nonjava=Directiva Tag: atributo language incorrecto
-jsp.error.page.defafterusar.language=Directiva Page: No puede definir language tras un scriptlet
-jsp.error.page.nomapping.language=Directiva Page: No hay mapeado para language:
-jsp.error.page.conflict.extends=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'extends' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.conflict.iselignored=Directiva Page: es ilegal tener m�ltiples ocurrencias de 'isELIgnored' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.tag.conflict.iselignored=Directiva Tag: es ilegal tener m�ltiples ocurrencias de 'isELIgnored' con valores distintos (viejo: {0}, nuevo: {1})
-jsp.error.page.invalid.iselignored=Directiva Page: valor inv�lido para isELIgnored
-jsp.error.tag.invalid.iselignored=Directiva Tag: valor incorrecto para isELIgnored
-jsp.error.page.multi.pageencoding=La directiva Page no debe de tener m�ltiples ocurrencias de pageencoding
-jsp.error.tag.conflict.attr=Directiva Tag: es ilegal tener m�ltiples ocurrencias del atributo \"{0}\" con valores distintos (viejo: {1}, nuevo: {2})
-jsp.error.tag.multi.pageencoding=La directiva Tag no debe de tener m�ltiples ocurrencias de pageencoding
-jsp.error.page.bad_b_and_a_combo=Directiva Page: Combinaci�n ilegal de buffer=\"none\" y autoFlush=\"false\"
-jsp.error.not.impl.taglib=Error Interno: Tag extensions no implementado
-jsp.error.include.missing.file=No tiene argumento de nombre de fichero
-jsp.error.include.bad.file=Argumento de nombre de fichero no v�lido
-jsp.error.include.exception=No se puede incluir {0}
-jsp.error.stream.closed=Stream cerrado
-jsp.error.invalid.forward=Tag forward no v�lido
-jsp.error.unknownException=�Error no caturado!. Deber�as de considerar el poner una p�gina de error para avisar de los errores m�s elegantemente
-jsp.error.invalid.directive=Directiva no v�lida
-jsp.error.directive.istagfile=La Directiva {0} no puede usarse en archivo de tag
-jsp.error.directive.isnottagfile=La Directiva {0} s�lo se puede usar en un archivo de tag
-jsp.error.tagfile.tld.name=El atributo \"name\" de la directiva tag tiene un valor {0} mientras que el tag \"name\" del elemento \"tag-file\" en el TLD es {1}
-jsp.error.action.istagfile=La acci�n {0} no se puede usar en un archivo tag
-jsp.error.action.isnottagfile=La acci�n {0} s�lo se puede usar en archivos tag
-jsp.error.unterminated=Tag {0} no terminado
-jsp.error.usebean.notinsamefile=El Tag useBean debe de empezar y terminar en el mismo archivo f�sico
-jsp.error.loadclass.taghandler=No se puede cargar la clase {0}
-jsp.error.unable.compile=No se puede compilar la clase para JSP
-jsp.error.unable.load=No se puede cargar la clase para JSP
-jsp.error.unable.rename=No se puede renombrar el archivo de clase {0} a {1}
-jsp.error.mandatory.atributo={0}: atributo obligatorio {1} perdido
-jsp.engine.info=Motor Jasper JSP 2.1
-jsp.error.invalid.expression="{0}" contiene expresiones incorrectas: {1}
-jsp.error.invalid.attribute={0}: Atributo incorrecto, {1}
-jsp.error.usebean.class.notfound=Clase: {0} no hallada
-jsp.error.file.cannot.read=No se puede leer el archivo: {0}
-jsp.error.file.already.registered=El archivo {0} ya se ha visto, �podr�a ser un include recursivo?
-jsp.error.file.not.registered=Archivo {0} not visto en include
-jsp.error.quotes.unterminated=Comillas no terminadas
-jsp.error.attr.quoted=El valor del atributo deber�a ir entre comillas
-jsp.error.attr.novalue=Atributo {0} no tiene valor
-jsp.error.tag.attr.unterminated=Lista de atributos del tag no terminada
-jsp.error.param.noname=No hay nombre en el tag PARAM
-jsp.error.param.novalue=No hay valor en el tag PARAM
-jsp.error.beans.nullbean=Se ha intentado una operaci�n de bean en un objeto nulo
-jsp.error.beans.nobeaninfo=No se puede encontrar BeanInfo para el bean ''{0}'' seguramente la clase no existe
-jsp.error.beans.introspection=Una excepci�n ha tenido lugar mientras se le�a el m�todo de lectura de la propiedad ''{0}'' en un bean del tipo ''{1}'':\n{2}
-jsp.error.beans.nomethod=No puedo encontrar un m�todo para leer la propiedad ''{0}'' en un bean del tipo ''{1}''
-jsp.error.beans.nomethod.setproperty=No puedo encontrar un m�todo para escribir la propiedad ''{0}'' en un bean del tipo ''{2}''
-jsp.error.beans.noproperty=No puedo encontrar informaci�n de la propiedad ''{0}'' en un bean del tipo ''{1}''
-jsp.error.beans.setproperty.noindexset=No puedo poner la propiedad indexada
-jsp.error.include.tag=Tag jsp:include no v�lido
-jsp.error.include.noflush=jsp:include necesita tener \"flush=true\"
-jsp.error.include.badflush=jsp:include page=\"...\" flush=\"true\" es la �nica combinaci�n v�lida en JSP 1.0
-jsp.error.attempt_to_clear_flushed_buffer=Error: Se ha intentado limpiar un buffer que ya hab�a sido escrito
-jsp.error.overflow=Error:Buffer de JSP desbordado
-jsp.error.paramexpected=El tag \"param\" era esperado con los atributos \"name\" y \"value\" despu�s del tag \"params\".
-jsp.error.param.invalidUse=La acci�n jsp:param no debe de ser usada fuera de los elementos jsp:include, jsp:forward o jsp:params
-jsp.error.params.invalidUse=jsp:params debe de ser un hijo directo de jsp:plugin
-jsp.error.fallback.invalidUse=jsp:fallback debe de ser un hijo directo de jsp:plugin
-jsp.error.namedAttribute.invalidUse=jsp:attribute debe de ser el subelemento de una acci�n est�ndar o de cliente
-jsp.error.jspbody.invalidUse=jsp:body debe de ser el subelemento de una acci�n est�ndar o de cliente
-jsp.error.closeindividualparam=El tag param necesita ser cerrado con \"/>\"
-jsp.error.closeparams=El tag param necesita ser cerrado con /params
-jsp.error.params.emptyBody=jsp:params debe de contener al menos un jsp:param anidado
-jsp.error.params.illegalChild=jsp:params no debe de contener elementos anidados que no sean jsp:param
-jsp.error.plugin.notype=Tipo no declarado en jsp:plugin
-jsp.error.plugin.badtype=Valor ilegal para atributo 'type' en jsp:plugin: debe de ser 'bean' o 'applet'
-jsp.error.plugin.nocode=C�digo no declarado en jsp:plugin
-jsp.error.ise_on_clear=Es ilegal usar clear() cuando el tama�o del buffer es cero
-jsp.error.setproperty.beanNotFound=setProperty: Bean {0} no encontrado
-jsp.error.getproperty.beanNotFound=getProperty: Bean {0} no encontrado
-jsp.error.setproperty.ClassNotFound=setProperty: clase {0} no encontrada
-# typo ?
-#jsp.error.setproperty.invalidSayntax=setProperty: can't have non-null value when property=*
-jsp.error.setproperty.invalidSyantax=setProperty: No puede haber un valor no nulo cuando se ha especificado property=*
-jsp.error.setproperty.beanInfoNotFound=setproperty: beanInfo para bean {0} no encontrado
-jsp.error.setproperty.paramOrValue=setProperty: O param o value pueden estar presentes
-jsp.error.setproperty.arrayVal=setProperty: No puede escribir en la propiedad de array {0} a trav�s de una valor de cadena literal
-jsp.warning.keepgen=Aviso: valor incorrecto para el initParam keepgen. Se usar� el valor por defecto de \"false\"
-jsp.warning.xpoweredBy=Aviso: valor incorrecto para el initParam xpoweredBy. Se usar� el valor por defecto de \"false\"
-jsp.warning.enablePooling=Aviso: valor incorrecto para el initParam enablePooling. Se usar� el valor por defecto de \"true\"
-jsp.warning.invalidTagPoolSize=Aviso: valor incorrecto para el par�metro init llamado tagPoolSize. Se usar� la medida por defecto de {0}
-jsp.warning.mappedFile=Aviso: valor incorrecto para el initParam mappedFile. Se usar� el valor por defecto de \"false\"
-jsp.warning.sendErrToClient=Aviso: valor incorrecto para el initParam sendErrToClient. Se usar� el valor por defecto de \"false\"
-jsp.warning.classDebugInfo=Aviso: valor incorrecto para el initParam classdebuginfo. Se usar� el valor por defecto de \"false\"
-jsp.warning.checkInterval=Aviso: valor incorrecto para el initParam checkInterval. Se usar� el valor por defecto de \"300\" segundos
-jsp.warning.development=Aviso: valor incorrecto para el initParam development. Se usar� el valor por defecto de \"true\"
-jsp.warning.fork=Aviso: valor incorrecto para el initParam fork. Se usar� el valor por defecto de \"true\"
-jsp.warning.reloading=Aviso: valor incorrecto para el initParam reloading. Se usar� el valor por defecto de \"true\"
-jsp.warning.dumpSmap=Aviso: valor incorrecto para el initParam dumpSmap. Se usar� el valor por defecto de \"false\"
-jsp.warning.genchararray=Aviso: valor incorrecto para el initParam genStrAsCharArray. Se usar� el valor por defecto de \"false\"
-jsp.warning.suppressSmap=Aviso: valor incorrecto para el initParam suppressSmap. Se usar� el valor por defecto de \"false\"
-jsp.error.badtaglib=No se puede abrir la biblioteca de tags {0}: {1}
-jsp.error.badGetReader=No se puede crear un reader cuando el stream no tiene buffer
-jsp.warning.unknown.element.in.taglib=Elemento desconocido ({0}) en taglib
-jsp.warning.unknown.element.in.tag=Elemento desconocido ({0}) en tag
-jsp.warning.unknown.element.in.tagfile=Elemento desconocido ({0}) en tag-file
-jsp.warning.unknown.element.in.attribute=Elemento desconocido ({0}) en attribute
-jsp.warning.unknown.element.in.variable=Elemento desconocido ({0}) en variable
-jsp.warning.unknown.element.in.validator=Elemento desconocido ({0}) en validator
-jsp.warning.unknown.element.in.initParam=Elemento desconocido ({0}) en init-param de validator
-jsp.warning.unknown.element.in.function=Elemento desconocido ({0}) en function
-jsp.error.more.than.one.taglib=M�s de una biblioteca de tags en el TLD: {0}
-jsp.error.teiclass.instantiation=No se puede cargar la clase TagExtraInfo llamada: {0}
-jsp.error.non_null_tei_and_var_subelems=Tag {0} tiene uno o m�s subelementos variable y una clase TagExtraInfo que devuelve una o m�s VariableInfo
-jsp.error.parse.error.in.TLD=Error de an�lisis en el descriptor de biblioteca de tags: {0}
-jsp.error.unable.to.open.TLD=No se puede abrir el descriptor de biblioteca de tags: {0}
-jsp.buffer.size.zero=Tama�o de buffer <= 0
-jsp.error.file.not.found=Archivo JSP \"{0}\" no encontrado
-jsp.message.copyinguri=Copiando {0} en {1}
-jsp.message.htmlcomment=\nQuitando comentario: \t{0}
-jsp.message.handling_directive=\nResolviendo directiva: {0}\t{1}
-jsp.message.handling_plugin=\nPlugin: {0}
-jsp.message.package_name_is=El Nombre del Package es: {0}
-jsp.message.class_name_is=El Nombre de la clase es: {0}
-jsp.message.java_file_name_is=El Nombre del Archivo Java es: {0}
-jsp.message.class_file_name_is=El Nombre del Archivo de clase es: {0}
-jsp.message.accepted=Acept� {0} en {1}
-jsp.message.adding_jar=A�adiendo jar {0} a mi classpath
-jsp.message.compiling_with=Compilado con: {0}
-jsp.message.template_text=texto plantilla
-jsp.error.missing_attribute=De acuerdo con el TLD el atributo {0} es obligatorio para el tag {1}
-jsp.error.bad_attribute=El atributo {0} no es v�lido seg�n el TLD especificado
-jsp.error.tld.unable_to_read=Imposible de leer TLD \"{1}\" desde archivo JAR \"{0}\": {2}
-jsp.error.tld.unable_to_get_jar=Imposible obtener recurso JAR \"{0}\" conteniendo TLD: {1}
-jsp.error.tld.missing_jar=Falta recurso JAR \"{0}\" conteniendo TLD
-jsp.error.webxml_not_found=No puedo localizar web.xml
-jsp.cmd_line.usage=Uso: jsptoservlet [-dd <ruta/a/DirectorioSalida>] [-keepgenerated] <Archivos .jsp>
-jsp.message.cp_is=Classpath {0} es: {1}
-jsp.error.unable.to_load_taghandler_class=No se puede cargar clase manejadora {0} del tag a causa de {1}
-jsp.error.unable.to_find_method=No se puede encontrar el m�todo de escritura para el atributo: {0}
-jsp.error.unable.to_convert_string=No pude convertir un String a {0} para atributo {1}
-jsp.error.unable.to_introspect=No se puede hacer introspecci�n en manejador de tag clase: {0} a causa de {1}
-jsp.error.bad_tag=No existe el tag {0} en la biblioteca importada con prefijo {1}
-jsp.error.xml.bad_tag=No se ha definido el tag \"{0}\" en la biblioteca tag asociada con uri \"{1}\"
-jsp.error.bad_string_Character=No puede extraer un Character desde un array de tama�o cero
-jsp.error.bad_string_char=No puede extraer un char desde un array de tama�o cero
-jsp.warning.compiler.class.cantcreate=No puedo crear una instancia de la clase especificada {0} de plugin del compilador debido a {1}. Se usar� el compilador Java de Sun.
-jsp.warning.compiler.class.notfound=No puedo encontrar una instancia de la clase {0} de plugin de compilador. Se usar� el compilador del Java de Sun.
-jsp.warning.compiler.path.notfound=Trayectoria del compilador especificado {0} no encontrada. Se usar� el PATH del sistema.
-jsp.error.jspc.uriroot_not_dir=La opci�n -uriroot debe de especificar un directorio ya existente
-jsp.error.jspc.missingTarget=Falta target: Debe de especificar -webapp o -uriroot o una o m�s p�ginas JSP
-jsp.error.jspc.no_uriroot=No se ha especificado uriroot y no puede ser localizado en los archivos JSP especificados
-jspc.implicit.uriRoot=uriRoot implicitamente puesto a "{0}"
-jspc.usage=Uso: jspc <opciones> [--] <Archivos JSP>\n\
-donde <Archivos JSP> son:\n\
-\ -webapp <dir> Un directorio conteniendo una web-app. Todas las\n\
-\ p�ginas jsp ser�n compiladas recursivamente\n\
-o cualquier n�mero de\n\
-\ <Archivo> Un Archivo para ser interpretado como una p�gina jsp\n\
-y donde <opciones> incluyen:\n\
-\ -help Muestra este mensaje de ayuda\n\
-\ -v Modo detallado\n\
-\ -d <dir> Directorio de salida\n\
-\ -l Muestra el nombre de la p�gina JSP al ocurrir un fallo\n\
-\ -s Muestra el nombre de la p�gina JSP al tener �xito\n\
-\ -p <name> Nombre del package objetivo\n\
-\ (por defecto org.apache.jsp)\n\
-\ -c <name> Nombre de la clase objetivo\n\
-\ (s�lo se aplica a la primera p�gina JSP)\n\
-\ -mapped Genera llamadas separadas a write() para cada l�nea de\n\
-\ HTML en el JSP\n\
-\ -die[#] Genera un c�digo de retorno de error (#) en errores\n\
-\ fatales. (por defecto 1).\n\
-\ -uribase <dir> El directorio uri de donde deben de partir las\n\
-\ compilaciones. (por defecto "/")\n\
-\ -uriroot <dir> Igual que -webapp\n\
-\ -compile Compila los servlets generados\n\
-\ -webinc <file> Crea unos mapeos parciales de servlet en el archivo\n\
-\ -webxml <file> Crea un web.xml completo en el archivo.\n\
-\ -ieplugin <clsid> Java Plugin classid para Internet Explorer\n\
-\ -classpath <path> Pasa por alto la propiedad de sistema java.class.path\n\
-\ -xpoweredBy A�ade cabecera de respuesta X-Powered-By\n\
-\ -trimSpaces Trim spaces in template text between actions, directives\n\
-\ -javaEncoding <enc> Set the encoding charset for Java classes (default UTF-8)\n\
-\ -source <version> Set the -source argument to the compiler (default 1.4)\n\
-\ -target <version> Set the -target argument to the compiler (default 1.4)\n\
-
-jspc.webxml.header=<?xml version="1.0" encoding="ISO-8859-1"?>\n\
-\n\
-<!DOCTYPE web-app\n\
-\ PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"\n\
-\ "http://java.sun.com/dtd/web-app_2_3.dtd">\n\
-<!--\n\
-Creado automaticamente mediante Apache Jakarta Tomcat JspC.\n\
--->\n\
-<web-app>\n\
-\n
-jspc.webxml.footer=\n\
-</web-app>\n\
-\n
-jspc.webinc.header=\n\
-<!--\n\
-Creado automaticamente mediante Apache Jakarta Tomcat JspC.\n\
-Coloque este fragmento en el fichero web.xml antes de \n\
-todos los elementos: icon, display-name, description, \n\
-distributable y context-param .\n\
--->\n
-jspc.webinc.footer=\n\
-<!--\n\
-Los Elementos: session-config, mime-mapping, welcome-file-list, error-page, taglib,\n\
-resource-ref, security-constraint, login-config, security-role,\n\
-env-entry y ejb-ref deber�n de ir despu�s de este fragmento .\n\
--->\n
-jspc.webinc.insertEnd=<!-- Fin de mapeos de servlet JSPC -->
-jspc.webinc.insertStart=<!-- Inicio de mapeos de servlet JSPC -->
-jspc.error.jasperException=error-el archivo ''{0}'' ha generado la excepci�n de sint�xis siguiente: {1}
-jspc.error.generalException=ERROR-el archivo ''{0}'' ha generado la excepci�n general siguiente:
-jspc.error.fileDoesNotExist=El archivo ''{0}'' utilizado como argumento no existe.
-jspc.error.emptyWebApp=-webapp necesita un argumento de archivo
-jsp.error.library.invalid=La p�gina JSP es incorrecta de acuerdo a la biblioteca {0}: {1}
-jsp.error.tlvclass.instantiation=No pude cargar o instanciar clase TagLibraryValidator: {0}
-jsp.error.tlv.invalid.page=Mensajes de error de validaci�n desde TagLibraryValidator para {0} in {1}
-jsp.error.tei.invalid.attributes=Mensajes de error de validaci�n desde TagExtraInfo para {0}
-jsp.parser.sax.propertynotsupported=Propiedad SAX no soportada: {0}
-jsp.parser.sax.propertynotrecognized=Propiedad SAX no reconocida: {0}
-jsp.parser.sax.featurenotsupported=Caracter�stica SAX no soportada: {0}
-jsp.parser.sax.featurenotrecognized=Caracter�stica SAX no reconocida: {0}
-jsp.error.no.more.content=Alcanzado fin de contenido mietras se requer�a m�s an�lisis: �error de anidamiento de tag?
-jsp.error.parse.xml=Error de an�lisis XML en archivo {0}
-jsp.error.parse.xml.line=Error de an�lisis XML en archivo {0}: (l�nea {1}, col {2})
-jsp.error.parse.xml.scripting.invalid.body=El cuerpo de elemento {0} no debe de contener elementos XML
-jsp.error.internal.tldinit=No pude inicializar TldLocationsCache: {0}
-jsp.error.internal.filenotfound=Error Interno: Archivo {0} no hallado
-jsp.error.internal.evaluator_not_found=Error interno: no pude cargar evaluador de expresiones
-jsp.error.parse.xml.invalidPublicId=PUBLIC ID incorrecta: {0}
-jsp.error.include.flush.invalid.value=Valor incorrecto para atributo flush: {0}
-jsp.error.unsupported.encoding=Codificaci�n no soportada: {0}
-tld.error.variableNotAllowed=Es un error para un tag, que tiene uno o m�s subelementos variables, el tener una clase TagExtraInfo que devuelve un objeto no nulo.
-jsp.error.tldInWebDotXmlNotFound=No pude localizar TLD {1} para URI {0} especificado en web.xml
-jsp.error.taglibDirective.absUriCannotBeResolved=La uri absoluta: {0} no puede resolverse o en web.xml o el los archivos jar desplegados con esta aplicaci�n
-jsp.error.taglibDirective.missing.location=No se ha especificado ni el atributo \'uri\' ni el \'tagdir\'
-jsp.error.taglibDirective.both_uri_and_tagdir=Se han especificado ambos atributos \'uri\' y \'tagdir\'
-jsp.error.invalid.tagdir=El directorio de archivo Tag {0} no comienza con \"/WEB-INF/tags\"
-jsp.error.unterminated.user.tag=Tag definido por usuario no terminado: tag final {0} no hallado o anidado incorrectamente
+jsp.error.bad.servlet.engine = \u00A1Versi\u00F3n incorrecta del motor servlet\!
+jsp.error.no.scratch.dir = El motor JSP no tiene configurado un directorio de trabajo.\n\
+ \ A\u00F1ada "jsp.initparams\=scratchdir\=<dir-name>" \n\
+ \ en el fichero servlets.properties para este contexto.
+jsp.error.bad.scratch.dir = El directorio de trabajo especificado\: {0} no es utilizable.
+jsp.message.scratch.dir.is = El directorio de trabajo para el motor JSP es\: {0}
+jsp.message.parent_class_loader_is = El cargador de clases es\: {0}
+jsp.message.dont.modify.servlets = IMPORTANTE\: No modifique los servlets generados
+jsp.error.not.impl.comments = Error Interno\: Comments no implementado
+jsp.error.not.impl.directives = Error Interno\: Directives no implementado
+jsp.error.not.impl.declarations = Error Interno\: Declarations no implementado
+jsp.error.not.impl.expressions = Error Interno\: Expressions no implementado
+jsp.error.not.impl.scriptlets = Error Interno\: Scriptlets no implementado
+jsp.error.not.impl.usebean = Error Interno\: useBean no implementado
+jsp.error.not.impl.getp = Error Interno\: getProperty no implementado
+jsp.error.not.impl.setp = Error Interno\: setProperty no implementado
+jsp.error.not.impl.plugin = Error Interno\: plugin no implementado
+jsp.error.not.impl.forward = Error Interno\: forward no implementado
+jsp.error.not.impl.include = Error Interno\: include no implementado
+jsp.error.unavailable = JSP ha sido marcado como no disponible
+jsp.error.usebean.missing.attribute = useBean\: falta atributo id o est\u00E1 mal digitado
+jsp.error.usebean.missing.type = useBean ({0})\: Se debe de especificar atributo class o type\:
+jsp.error.usebean.duplicate = useBean\: Nombre de bean duplicado\: {0}
+jsp.error.usebean.prohibited.as.session = No puedo usar como bean de sesi\u00F3n {0} ya que est\u00E1 prohibido por directiva jsp definida previamente\:
+jsp.error.usebean.not.both = useBean\: No puede especificar ambos atributos class y beanName\:
+jsp.error.usebean.bad.type.cast = useBean ({0})\: Tipo ({1}) no es asignable desde clase ({2})
+jsp.error.invalid.scope = Valor ilegal de atributo 'scope'\: {0} (debe de ser uno de "page", "request", "session", o "application")
+jsp.error.classname = No pude determinar el nombre de clase desde el fichero .class
+jsp.error.outputfolder = no hay carpeta de salida
+jsp.warning.bad.type = Aviso\: tipo incorrecto en archivo .class
+jsp.error.data.file.write = Error mientras escrib\u00EDa el archivo de datos
+jsp.error.page.invalid.buffer = Directiva Page\: valor incorrecto para buffer
+jsp.error.page.conflict.contenttype = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'contentType' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.invalid.contenttype = Directiva Page\: valor incorrecto para contentType
+jsp.error.page.conflict.session = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'session' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.invalid.session = Directiva Page\: valor incorrecto para session
+jsp.error.page.conflict.buffer = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'buffer'con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.invalid.buffer = Directiva Page\: valor incorrecto para b\u00FAfer
+jsp.error.page.conflict.autoflush = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'autoFlush' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.invalid.autoflush = \=Directiva Page\: valor incorrecto para autoFlush
+jsp.error.page.conflict.isthreadsafe = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'isThreadSafe' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.invalid.isthreadsafe = \=Directiva Page\: valor incorrecto para isThreadSafe
+jsp.error.page.conflict.info = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'info' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.invalid.info = \=Directiva Page\: valor incorrecto para info
+jsp.error.page.conflict.iserrorpage = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'isErrorPage' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.invalid.iserrorpage = \=Directiva Page\: valor incorrecto para isErrorPage
+jsp.error.page.conflict.errorpage = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'errorPage' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.conflict.language = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'language' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.tag.conflict.language = Directiva Tag\: es ilegal tener m\u00FAltiples ocurrencias de 'language' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.language.nonjava = Directiva Page\: atributo language incorrecto
+jsp.error.tag.language.nonjava = Directiva Tag\: atributo language incorrecto
+jsp.error.page.defafteruse.language = Directiva Page\: No puedo definir lenguage tras un scriptlet
+jsp.error.page.nomapping.language = Directiva Page\: No hay mapeado para language\:
+jsp.error.page.conflict.extends = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'extends' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.conflict.iselignored = Directiva Page\: es ilegal tener m\u00FAltiples ocurrencias de 'isELIgnored' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.tag.conflict.iselignored = Directiva Tag\: es ilegal tener m\u00FAltiples ocurrencias de 'isELIgnored' con valores distintos (viejo\: {0}, nuevo\: {1})
+jsp.error.page.invalid.iselignored = Directiva Page\: valor inv\u00E1lido para isELIgnored
+jsp.error.tag.invalid.iselignored = Directiva Tag\: valor incorrecto para isELIgnored
+jsp.error.page.multi.pageencoding = La directiva Page no debe de tener m\u00FAltiples ocurrencias de pageencoding
+jsp.error.tag.conflict.attr = Directiva Tag\: es ilegal tener m\u00FAltiples ocurrencias del atributo "{0}" con valores distintos (viejo\: {1}, nuevo\: {2})
+jsp.error.tag.multi.pageencoding = La directiva Tag no debe de tener m\u00FAltiples ocurrencias de pageencoding
+jsp.error.page.bad_b_and_a_combo = Directiva Page\: Combinaci\u00F3n ilegal de buffer\="none" y autoFlush\="false"
+jsp.error.not.impl.taglib = Error Interno\: Tag extensions no implementado
+jsp.error.include.missing.file = No tiene argumento de nombre de fichero
+jsp.error.include.bad.file = Argumento de nombre de fichero no v\u00E1lido
+jsp.error.include.exception = No se puede incluir {0}
+jsp.error.stream.closed = Stream cerrado
+jsp.error.invalid.forward = Tag forward no v\u00E1lido
+jsp.error.unknownException = \u00A1Error no caturado\!. Deber\u00EDas de considerar el poner una p\u00E1gina de error para avisar de los errores m\u00E1s elegantemente
+jsp.error.invalid.directive = Directiva no v\u00E1lida
+jsp.error.invalid.implicit = TLD impl\u00EDcito inv\u00E1lido para fichero de marca en {0}
+jsp.error.invalid.implicit.version = Versi\u00F3n inv\u00E1lida de JSP definida en TLD impl\u00EDcito para fichero de marca en {0}
+jsp.error.invalid.version = Versi\u00F3n inv\u00E1lida de JSP definida para fichero de marca en {0}
+jsp.error.directive.istagfile = La Directiva {0} no puede usarse en archivo de tag
+jsp.error.directive.isnottagfile = La Directiva {0} s\u00F3lo se puede usar en un archivo de tag
+jsp.error.tagfile.tld.name = El atributo "name" de la directiva tag tiene un valor {0} mientras que el tag "name" del elemento "tag-file" en el TLD es {1}
+jsp.error.action.istagfile = La acci\u00F3n {0} no se puede usar en un archivo tag
+jsp.error.action.isnottagfile = La acci\u00F3n {0} s\u00F3lo se puede usar en archivos tag
+jsp.error.unterminated = Tag {0} no terminado
+jsp.error.usebean.notinsamefile = El Tag useBean debe de empezar y terminar en el mismo archivo f\u00EDsico
+jsp.error.loadclass.taghandler = No se puede cargar la clase {0}
+jsp.error.unable.compile = No se puede compilar la clase para JSP
+jsp.error.unable.load = No se puede cargar la clase para JSP
+jsp.error.unable.rename = No se puede renombrar el archivo de clase {0} a {1}
+jsp.error.mandatory.attribute = {0}\: Falta atributo obligatorio {1}
+jsp.error.flush = Excepci\u00F3n sucedida al vaciar los datos
+jsp.engine.info = Motor Jasper JSP 2.1
+jsp.error.invalid.expression = "{0}" contiene expresiones incorrectas\: {1}
+jsp.error.invalid.attribute = {0}\: Atributo incorrecto, {1}
+jsp.error.usebean.class.notfound = Clase\: {0} no hallada
+jsp.error.file.cannot.read = No se puede leer el archivo\: {0}
+jsp.error.file.already.registered = El archivo {0} ya se ha visto, \u00BFpodr\u00EDa ser un include recursivo?
+jsp.error.file.not.registered = Archivo {0} not visto en include
+jsp.error.quotes.unterminated = Comillas no terminadas
+jsp.error.attr.quoted = El valor del atributo deber\u00EDa ir entre comillas
+jsp.error.attr.novalue = Atributo {0} no tiene valor
+jsp.error.tag.attr.unterminated = Lista de atributos del tag no terminada
+jsp.error.param.noname = No hay nombre en el tag PARAM
+jsp.error.param.novalue = No hay valor en el tag PARAM
+jsp.error.beans.nullbean = Se ha intentado una operaci\u00F3n de bean en un objeto nulo
+jsp.error.beans.nobeaninfo = No se puede encontrar BeanInfo para el bean ''{0}'' seguramente la clase no existe
+jsp.error.beans.introspection = Una excepci\u00F3n ha tenido lugar mientras se le\u00EDa el m\u00E9todo de lectura de la propiedad ''{0}'' en un bean del tipo ''{1}''\:\n\
+ {2}
+jsp.error.beans.nomethod = No puedo encontrar un m\u00E9todo para leer la propiedad ''{0}'' en un bean del tipo ''{1}''
+jsp.error.beans.nomethod.setproperty = No puedo encontrar un m\u00E9todo para escribir la propiedad ''{0}'' en un bean del tipo ''{2}''
+jsp.error.beans.noproperty = No puedo encontrar informaci\u00F3n de la propiedad ''{0}'' en un bean del tipo ''{1}''
+jsp.error.beans.property.conversion = No puedo convertir cadena "{0}" a clase "{1}" para atributo "{2}"\: {3}
+jsp.error.beans.propertyeditor.notregistered = Editor de Propiedades no registrado con el PropertyEditorManager
+jsp.error.beans.setproperty.noindexset = No puedo poner la propiedad indexada
+jsp.error.include.tag = Tag jsp\:include no v\u00E1lido
+jsp.error.include.noflush = jsp\:include necesita tener "flush\=true"
+jsp.error.include.badflush = jsp\:include page\="..." flush\="true" es la \u00FAnica combinaci\u00F3n v\u00E1lida en JSP 1.0
+jsp.error.attempt_to_clear_flushed_buffer = Error\: Se ha intentado limpiar un buffer que ya hab\u00EDa sido escrito
+jsp.error.overflow = Error\:Buffer de JSP desbordado
+jsp.error.paramexpected = El tag "param" era esperado con los atributos "name" y "value" despu\u00E9s del tag "params".
+jsp.error.param.invalidUse = La acci\u00F3n jsp\:param no debe de ser usada fuera de los elementos jsp\:include, jsp\:forward o jsp\:params
+jsp.error.params.invalidUse = jsp\:params debe de ser un hijo directo de jsp\:plugin
+jsp.error.fallback.invalidUse = jsp\:fallback debe de ser un hijo directo de jsp\:plugin
+jsp.error.namedAttribute.invalidUse = jsp\:attribute debe de ser el subelemento de una acci\u00F3n est\u00E1ndar o de cliente
+jsp.error.jspbody.invalidUse = jsp\:body debe de ser el subelemento de una acci\u00F3n est\u00E1ndar o de cliente
+jsp.error.closeindividualparam = El tag param necesita ser cerrado con "/>"
+jsp.error.closeparams = El tag param necesita ser cerrado con /params
+jsp.error.params.emptyBody = jsp\:params debe de contener al menos un jsp\:param anidado
+jsp.error.params.illegalChild = jsp\:params no debe de contener elementos anidados que no sean jsp\:param
+jsp.error.plugin.notype = Tipo no declarado en jsp\:plugin
+jsp.error.plugin.badtype = Valor ilegal para atributo 'type' en jsp\:plugin\: debe de ser 'bean' o 'applet'
+jsp.error.plugin.nocode = C\u00F3digo no declarado en jsp\:plugin
+jsp.error.ise_on_clear = Es ilegal usar clear() cuando el tama\u00F1o del buffer es cero
+jsp.error.setproperty.beanNotFound = setProperty\: Bean {0} no encontrado
+jsp.error.getproperty.beanNotFound = getProperty\: Bean {0} no encontrado
+jsp.error.setproperty.ClassNotFound = setProperty\: clase {0} no encontrada
+jsp.error.javac = Excepci\u00F3n de Javac
+jsp.error.javac.env = Entorno
+jsp.error.compilation = Error compilando fichero\: {0} {1}
+jsp.error.setproperty.invalidSyntax = setproperty\: no puedo tener valor no nulo si la propiedad\=*
+jsp.error.setproperty.beanInfoNotFound = setproperty\: beanInfo para bean {0} no encontrado
+jsp.error.setproperty.paramOrValue = setProperty\: O param o value pueden estar presentes
+jsp.error.setproperty.arrayVal = setProperty\: No puede escribir en la propiedad de array {0} a trav\u00E9s de una valor de cadena literal
+jsp.warning.keepgen = Aviso\: valor incorrecto para el initParam keepgen. Se usar\u00E1 el valor por defecto de "false"
+jsp.warning.xpoweredBy = Aviso\: valor incorrecto para el initParam xpoweredBy. Se usar\u00E1 el valor por defecto de "false"
+jsp.warning.enablePooling = Aviso\: valor incorrecto para el initParam enablePooling. Se usar\u00E1 el valor por defecto de "true"
+jsp.warning.invalidTagPoolSize = Aviso\: valor incorrecto para el par\u00E1metro init llamado tagPoolSize. Se usar\u00E1 la medida por defecto de {0}
+jsp.warning.mappedFile = Aviso\: valor incorrecto para el initParam mappedFile. Se usar\u00E1 el valor por defecto de "false"
+jsp.warning.classDebugInfo = Aviso\: valor incorrecto para el initParam classdebuginfo. Se usar\u00E1 el valor por defecto de "false"
+jsp.warning.checkInterval = Aviso\: valor incorrecto para el initParam checkInterval. Se usar\u00E1 el valor por defecto de "300" segundos
+jsp.warning.modificationTestInterval = Aviso\: valor incorrecto para el initParam modificationTestInterval. Se usar\u00E1 el valor por defecto de "4" segundos
+jsp.warning.development = Aviso\: valor incorrecto para el initParam development. Se usar\u00E1 el valor por defecto de "true"
+jsp.warning.fork = Aviso\: valor incorrecto para el initParam fork. Se usar\u00E1 el valor por defecto de "true"
+jsp.warning.reloading = Aviso\: valor incorrecto para el initParam reloading. Se usar\u00E1 el valor por defecto de "true"
+jsp.warning.dumpSmap = Aviso\: valor incorrecto para el initParam dumpSmap. Se usar\u00E1 el valor por defecto de "false"
+jsp.warning.genchararray = Aviso\: valor incorrecto para el initParam genStrAsCharArray. Se usar\u00E1 el valor por defecto de "false"
+jsp.warning.suppressSmap = Aviso\: valor incorrecto para el initParam suppressSmap. Se usar\u00E1 el valor por defecto de "false"
+jsp.warning.displaySourceFragment = Aviso\: valor incorrecto para el initParam displaySourceFragment. Se usar\u00E1 el valor por defecto de "verdadero"
+jsp.error.badtaglib = No se puede abrir la biblioteca de tags {0}\: {1}
+jsp.error.badGetReader = No se puede crear un reader cuando el stream no tiene buffer
+jsp.warning.unknown.element.in.taglib = Elemento desconocido ({0}) en taglib
+jsp.warning.unknown.element.in.tag = Elemento desconocido ({0}) en tag
+jsp.warning.unknown.element.in.tagfile = Elemento desconocido ({0}) en tag-file
+jsp.warning.unknown.element.in.attribute = Elemento desconocido ({0}) en attribute
+jsp.warning.unknown.element.in.variable = Elemento desconocido ({0}) en variable
+jsp.warning.unknown.element.in.validator = Elemento desconocido ({0}) en validator
+jsp.warning.unknown.element.in.initParam = Elemento desconocido ({0}) en init-param de validator
+jsp.warning.unknown.element.in.function = Elemento desconocido ({0}) en function
+jsp.error.more.than.one.taglib = M\u00E1s de una biblioteca de tags en el TLD\: {0}
+jsp.error.teiclass.instantiation = No se puede cargar la clase TagExtraInfo llamada\: {0}
+jsp.error.non_null_tei_and_var_subelems = Tag {0} tiene uno o m\u00E1s subelementos variable y una clase TagExtraInfo que devuelve una o m\u00E1s VariableInfo
+jsp.error.parse.error.in.TLD = Error de an\u00E1lisis en el descriptor de biblioteca de tags\: {0}
+jsp.error.unable.to.open.TLD = No se puede abrir el descriptor de biblioteca de tags\: {0}
+jsp.buffer.size.zero = Tama\u00F1o de buffer <\= 0
+jsp.error.file.not.found = Archivo JSP "{0}" no encontrado
+jsp.message.copyinguri = Copiando {0} en {1}
+jsp.message.htmlcomment = \n\
+ Quitando comentario\: \t{0}
+jsp.message.handling_directive = \n\
+ Resolviendo directiva\: {0}\t{1}
+jsp.message.handling_plugin = \n\
+ Plugin\: {0}
+jsp.message.package_name_is = El Nombre del Package es\: {0}
+jsp.message.class_name_is = El Nombre de la clase es\: {0}
+jsp.message.java_file_name_is = El Nombre del Archivo Java es\: {0}
+jsp.message.class_file_name_is = El Nombre del Archivo de clase es\: {0}
+jsp.message.accepted = Acept\u00F3 {0} en {1}
+jsp.message.adding_jar = A\u00F1adiendo jar {0} a mi classpath
+jsp.message.compiling_with = Compilado con\: {0}
+jsp.message.template_text = texto plantilla
+jsp.error.missing_attribute = De acuerdo con el TLD el atributo {0} es obligatorio para el tag {1}
+jsp.error.bad_attribute = El atributo {0} no es v\u00E1lido seg\u00FAn el TLD especificado
+jsp.error.tld.unable_to_read = Imposible de leer TLD "{1}" desde archivo JAR "{0}"\: {2}
+jsp.error.tld.unable_to_get_jar = Imposible obtener recurso JAR "{0}" conteniendo TLD\: {1}
+jsp.error.tld.missing_jar = Falta recurso JAR "{0}" conteniendo TLD
+jsp.error.webxml_not_found = No puedo localizar web.xml
+jsp.cmd_line.usage = Uso\: jsptoservlet [-dd <ruta/a/DirectorioSalida>] [-keepgenerated] <Archivos .jsp>
+jsp.message.cp_is = Classpath {0} es\: {1}
+jsp.error.unable.to_load_taghandler_class = No se puede cargar clase manejadora {0} del tag a causa de {1}
+jsp.error.unable.to_find_method = No se puede encontrar el m\u00E9todo de escritura para el atributo\: {0}
+jsp.error.unable.to_convert_string = No pude convertir un String a {0} para atributo {1}
+jsp.error.unable.to_introspect = No se puede hacer introspecci\u00F3n en manejador de tag clase\: {0} a causa de {1}
+jsp.error.bad_tag = No existe el tag {0} en la biblioteca importada con prefijo {1}
+jsp.error.xml.bad_tag = No se ha definido el tag "{0}" en la biblioteca tag asociada con uri "{1}"
+jsp.error.bad_string_Character = No puede extraer un Character desde un array de tama\u00F1o cero
+jsp.error.bad_string_char = No puede extraer un char desde un array de tama\u00F1o cero
+jsp.warning.compiler.class.cantcreate = No puedo crear una instancia de la clase especificada {0} de plugin del compilador debido a {1}. Se usar\u00E1 el compilador Java de Sun.
+jsp.warning.compiler.class.notfound = No puedo encontrar una instancia de la clase {0} de plugin de compilador. Se usar\u00E1 el compilador del Java de Sun.
+jsp.warning.compiler.path.notfound = Trayectoria del compilador especificado {0} no encontrada. Se usar\u00E1 el PATH del sistema.
+jsp.error.jspc.uriroot_not_dir = La opci\u00F3n -uriroot debe de especificar un directorio ya existente
+jsp.error.jspc.missingTarget = Falta target\: Debe de especificar -webapp o -uriroot o una o m\u00E1s p\u00E1ginas JSP
+jsp.error.jspc.no_uriroot = No se ha especificado uriroot y no puede ser localizado en los archivos JSP especificados
+jspc.implicit.uriRoot = uriRoot implicitamente puesto a "{0}"
+jspc.usage = Uso\: jspc <opciones> [--] <Archivos JSP>\n\
+ donde <Archivos JSP> son\:\n\
+ \ -webapp <dir> Un directorio conteniendo una web-app. Todas las\n\
+ \ p\u00E1ginas jsp ser\u00E1n compiladas recursivamente\n\
+ o cualquier n\u00FAmero de\n\
+ \ <Archivo> Un Archivo para ser interpretado como una p\u00E1gina jsp\n\
+ y donde <opciones> incluyen\:\n\
+ \ -help Muestra este mensaje de ayuda\n\
+ \ -v Modo detallado\n\
+ \ -d <dir> Directorio de salida\n\
+ \ -l Muestra el nombre de la p\u00E1gina JSP al ocurrir un fallo\n\
+ \ -s Muestra el nombre de la p\u00E1gina JSP al tener \u00E9xito\n\
+ \ -p <name> Nombre del package objetivo\n\
+ \ (por defecto org.apache.jsp)\n\
+ \ -c <name> Nombre de la clase objetivo\n\
+ \ (s\u00F3lo se aplica a la primera p\u00E1gina JSP)\n\
+ \ -mapped Genera llamadas separadas a write() para cada l\u00EDnea de\n\
+ \ HTML en el JSP\n\
+ \ -die[\#] Genera un c\u00F3digo de retorno de error (\#) en errores\n\
+ \ fatales. (por defecto 1).\n\
+ \ -uribase <dir> El directorio uri de donde deben de partir las\n\
+ \ compilaciones. (por defecto "/")\n\
+ \ -uriroot <dir> Igual que -webapp\n\
+ \ -compile Compila los servlets generados\n\
+ \ -webinc <file> Crea unos mapeos parciales de servlet en el archivo\n\
+ \ -webxml <file> Crea un web.xml completo en el archivo.\n\
+ \ -ieplugin <clsid> Java Plugin classid para Internet Explorer\n\
+ \ -classpath <path> Pasa por alto la propiedad de sistema java.class.path\n\
+ \ -xpoweredBy A\u00F1ade cabecera de respuesta X-Powered-By\n\
+ \ -trimSpaces Trim spaces in template text between actions, directives\n\
+ \ -javaEncoding <enc> Set the encoding charset for Java classes (default UTF-8)\n\
+ \ -source <version> Set the -source argument to the compiler (default 1.4)\n\
+ \ -target <version> Set the -target argument to the compiler (default 1.4)\n
+jspc.webxml.header = <?xml version\="1.0" encoding\="ISO-8859-1"?>\n\
+ \n\
+ <\!DOCTYPE web-app\n\
+ \ PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"\n\
+ \ "http\://java.sun.com/dtd/web-app_2_3.dtd">\n\
+ <\!--\n\
+ Creado automaticamente mediante Apache Jakarta Tomcat JspC.\n\
+ -->\n\
+ <web-app>\n\
+ \n
+jspc.webxml.footer = \n\
+ </web-app>\n\
+ \n
+jspc.webinc.header = \n\
+ <\!--\n\
+ Creado automaticamente mediante Apache Jakarta Tomcat JspC.\n\
+ Coloque este fragmento en el fichero web.xml antes de \n\
+ todos los elementos\: icon, display-name, description, \n\
+ distributable y context-param .\n\
+ -->\n
+jspc.webinc.footer = \n\
+ <\!--\n\
+ Los Elementos\: session-config, mime-mapping, welcome-file-list, error-page, taglib,\n\
+ resource-ref, security-constraint, login-config, security-role,\n\
+ env-entry y ejb-ref deber\u00E1n de ir despu\u00E9s de este fragmento .\n\
+ -->\n
+jspc.webinc.insertEnd = <\!-- Fin de mapeos de servlet JSPC -->
+jspc.webinc.insertStart = <\!-- Inicio de mapeos de servlet JSPC -->
+jspc.error.jasperException = error-el archivo ''{0}'' ha generado la excepci\u00F3n de sint\u00E1xis siguiente\: {1}
+jspc.error.generalException = ERROR-el archivo ''{0}'' ha generado la excepci\u00F3n general siguiente\:
+jspc.error.fileDoesNotExist = El archivo ''{0}'' utilizado como argumento no existe.
+jspc.error.emptyWebApp = -webapp necesita un argumento de archivo
+jsp.error.library.invalid = La p\u00E1gina JSP es incorrecta de acuerdo a la biblioteca {0}\: {1}
+jsp.error.tlvclass.instantiation = No pude cargar o instanciar clase TagLibraryValidator\: {0}
+jsp.error.tlv.invalid.page = Mensajes de error de validaci\u00F3n desde TagLibraryValidator para {0} in {1}
+jsp.error.tei.invalid.attributes = Mensajes de error de validaci\u00F3n desde TagExtraInfo para {0}
+jsp.parser.sax.propertynotsupported = Propiedad SAX no soportada\: {0}
+jsp.parser.sax.propertynotrecognized = Propiedad SAX no reconocida\: {0}
+jsp.parser.sax.featurenotsupported = Caracter\u00EDstica SAX no soportada\: {0}
+jsp.parser.sax.featurenotrecognized = Caracter\u00EDstica SAX no reconocida\: {0}
+jsp.error.no.more.content = Alcanzado fin de contenido mietras se requer\u00EDa m\u00E1s an\u00E1lisis\: \u00BFerror de anidamiento de tag?
+jsp.error.parse.xml = Error de an\u00E1lisis XML en archivo {0}
+jsp.error.parse.xml.line = Error de an\u00E1lisis XML en archivo {0}\: (l\u00EDnea {1}, col {2})
+jsp.error.parse.xml.scripting.invalid.body = El cuerpo de elemento {0} no debe de contener elementos XML
+jsp.error.internal.tldinit = No pude inicializar TldLocationsCache\: {0}
+jsp.error.internal.filenotfound = Error Interno\: Archivo {0} no hallado
+jsp.error.internal.evaluator_not_found = Error interno\: no pude cargar evaluador de expresiones
+jsp.error.parse.xml.invalidPublicId = PUBLIC ID incorrecta\: {0}
+jsp.error.include.flush.invalid.value = Valor incorrecto para atributo flush\: {0}
+jsp.error.unsupported.encoding = Codificaci\u00F3n no soportada\: {0}
+tld.error.variableNotAllowed = Es un error para un tag, que tiene uno o m\u00E1s subelementos variables, el tener una clase TagExtraInfo que devuelve un objeto no nulo.
+jsp.error.tldInWebDotXmlNotFound = No pude localizar TLD {1} para URI {0} especificado en web.xml
+jsp.error.taglibDirective.absUriCannotBeResolved = La uri absoluta\: {0} no puede resolverse o en web.xml o el los archivos jar desplegados con esta aplicaci\u00F3n
+jsp.error.taglibDirective.missing.location = No se ha especificado ni el atributo 'uri' ni el 'tagdir'
+jsp.error.taglibDirective.both_uri_and_tagdir = Se han especificado ambos atributos 'uri' y 'tagdir'
+jsp.error.invalid.tagdir = El directorio de archivo Tag {0} no comienza con "/WEB-INF/tags"
+jsp.error.unterminated.user.tag = Tag definido por usuario no terminado\: tag final {0} no hallado o anidado incorrectamente
#jspx.error.templateDataNotInJspCdata=Validation Error: Element <{0}> cannot have template data. Template data must be encapsulated within a <jsp:cdata> element. [JSP1.2 PFD section 5.1.9]\nTemplate data in error: {1}
-jspx.error.templateDataNotInJspCdata=Error de Validaci�n: El Elemento <{0}> no puede tener datos plantilla. Los datos plantilla deben de estar encapsulados dentro de un elemento <jsp:text>. [JSP1.2 PFD secci�n 5.1.9]\nDatos de Plantilla en error: {1}
+jspx.error.templateDataNotInJspCdata = Error de Validaci\u00F3n\: El Elemento <{0}> no puede tener datos plantilla. Los datos plantilla deben de estar encapsulados dentro de un elemento <jsp\:text>. [JSP1.2 PFD secci\u00F3n 5.1.9]\n\
+ Datos de Plantilla en error\: {1}
#Error while processing taglib jar file {0}: {1}
-jsp.error.taglib.reserved.prefix=El prefijo taglib {0} est� reservado
-jsp.error.invalid.javaEncoding=Codificaciones java incorrectas. Intent� {0} y luego {1}. Ambas fallaron.
-jsp.error.needAlternateJavaEncoding=La codificaci�n java por defecto {0} es incorrecta en tu plataforma java. Se puede especificar una alternativa v�a par�metro 'javaEncoding' de JspServlet.
+jsp.error.taglib.reserved.prefix = El prefijo taglib {0} est\u00E1 reservado
+jsp.error.invalid.javaEncoding = Codificaciones java incorrectas. Intent\u00E9 {0} y luego {1}. Ambas fallaron.
+jsp.error.needAlternateJavaEncoding = La codificaci\u00F3n java por defecto {0} es incorrecta en tu plataforma java. Se puede especificar una alternativa v\u00EDa par\u00E1metro 'javaEncoding' de JspServlet.
#Error when compiling, used for jsp line number error messages
-jsp.error.single.line.number=Ha tenido lugar un error en la l�nea: {0} en el archivo jsp: {1}
-jsp.error.multiple.line.number=\n\nHa tenido lugar un error entre las l�neas: {0} y {1} en el archivo jsp: {2}\n\n
-jsp.error.corresponding.servlet=Error de servlet generado:\n
-jsp.error.empty.body.not.allowed=Cuerpo vac�o no permitido para {0}
-jsp.error.jspbody.required=Se debe de usar jsp:body para especificar cuerpo tag para {0} si se usa jsp:attribute.
-jsp.error.jspbody.emptybody.only=El tag {0} s�lo puede tener jsp:attribute en su cuerpo.
-jsp.error.no.scriptlets=Los elementos de Scripting (<%!, <jsp:declaration, <%=, <jsp:expression, <%, <jsp:scriptlet ) no est�n permitidos aqu�.
-jsp.error.internal.unexpected_node_type=Error Interno: Encontrado tipo de nodo inesperado
-jsp.error.tld.fn.invalid.signature=Sint�xis incorrecta para firma de funci�n en TLD. Biblioteca de Tag: {0}, Funci�n: {1}
-jsp.error.tld.fn.duplicate.name=Nombre duplicado de funci�n {0} en biblioteca de tag {1}
-jsp.error.tld.fn.invalid.signature.commaexpected=Sint�xis incorrecta para firma de funci�n en TLD. Se esperaba Coma ','. Biblioteca de Tag: {0}, Funci�n: {1}.
-jsp.error.tld.fn.invalid.signature.parenexpected=Sint�xis incorrecta para firma de funci�n en TLD. Se esperaba Par�ntesis '('. Biblioteca de Tag: {0}, Funci�n: {1}.
-jsp.error.tld.mandatory.element.missing=Falta o est� vac�o elemento TLD obligatorio: {0}
-jsp.error.dynamic.attributes.not.implemented=El tag {0} declara que acepta atributos din�micos pero no implementa la interfaz requerida
-jsp.error.nomatching.fragment=No puedo hallar una directiva de atributo (con name={0} y fragment=true) antes de la directiva de fragment.
-jsp.error.attribute.noequal=se esperaba s�mbolo igual
-jsp.error.attribute.noquote=se esperaba s�mbolo comillas
-jsp.error.attribute.unterminated=el atributo para {0} no est� terminado correctamente
-jsp.error.missing.tagInfo=El objeto TagInfo para {0} falta del TLD
-jsp.error.fragmentwithtype=No puede especificar ambos atributos 'fragment' y 'type'. Si est� presente 'fragment', 'type' se pone como 'javax.servlet.jsp.tagext.JspFragment'
-jsp.error.fragmentwithrtexprvalue=No puede especificar ambos atributos 'fragment' y 'rtexprvalue'. Si est� presente 'fragment', 'rtexprvalue' se pone como 'true'
-jsp.error.fragmentWithDeclareOrScope=Ambos atributos 'fragment' y 'declare' o 'scope' se han especificado en la directiva variable
-jsp.error.var_and_varReader=S�lo se puede especificar uno de \'var\' o \'varReader\'
-jsp.error.missing_var_or_varReader=Falta atributo \'var\' o \'varReader\'
-jsp.warning.bad.urlpattern.propertygroup=Valor malo {0} en el subelemento url-pattern en web.xml
-jsp.error.unknown_attribute_type=Tipo de atributo desconocido ({1}) para atributo {0}.
-jsp.error.jspelement.missing.name=Falta atributo obligatorio XML-style \'name\'
-jsp.error.xmlns.redefinition.notimplemented=Error interno: Intento de redefinir xmlns:{0}. La redefinici�n de espacios de nombre no est� implementada.
-jsp.error.could.not.add.taglibraries=No pude a�adir una o m�s bibliotecas.
-jsp.error.duplicate.name.jspattribute=El atributo {0} especificado en la acci�n standard o custom tambi�n aparece como el valor del atributo name en jsp:attribute
-jsp.error.not.in.template={0} no permitido en una plantilla cuerpo de texto.
-jsp.error.badStandardAction=Acci�n est�ndar incorrecta
-jsp.error.xml.badStandardAction=Acci�n est�ndar incorrecta: {0}
-jsp.error.tagdirective.badbodycontent=body-content incorrecto ({0}) en directiva tag
-jsp.error.simpletag.badbodycontent=El TLD para la clase {0} especifica un body-content es incorrecto (JSP) para un SimpleTag.
-jsp.error.config_pagedir_encoding_mismatch=El Page-encoding especificado en jsp-property-group ({0}) es diferente del especificado en la diectiva page ({1})
-jsp.error.prolog_pagedir_encoding_mismatch=El Page-encoding especificado en XML prolog ({0}) difiere del especificado en la directiva page ({1})
-jsp.error.prolog_config_encoding_mismatch=El Page-encoding especificado en XML prolog ({0}) difiere del especificado en jsp-property-group ({1})
-jsp.error.attribute.custom.non_rt_with_expr=Seg�n el TLD o la directiva attribute del archivo tag, el atributo {0} no acepta expresiones
-jsp.error.attribute.standard.non_rt_with_expr=El atributo {0} de la acci�n est�ndar {1} no acepta expresiones
-jsp.error.scripting.variable.missing_name=Imposible determinar nombre de variable de scripting desde atributo {0}
-jasper.error.emptybodycontent.nonempty=Seg�n el TLD, el tag {0} debe de estar vac�o, pero no lo est�
-jsp.error.tagfile.nameNotUnique=El valor de {0} y el valor de {1} en la l�nea {2} son el mismo.
-jsp.error.tagfile.nameFrom.noAttribute=No puedo hallar una directiva attribute con un atributo name con un valor \"{0}\", el valor de este atributo name-from-attribute.
-jsp.error.tagfile.nameFrom.badAttribute=La directiva attribute (declarada en la l�nea {1} y cuyo atributo name es \"{0}\", el valor de este atributo name-from-attribute attribute) debe de ser del tipo java.lang.String, es \"required\" y no un \"rtexprvalue\".
-jsp.error.page.noSession=No puedo acceder al �mbito de sesi�n en una p�gina que no participa en una sesi�n
-jsp.error.useBean.noSession=Es ilegal para useBean usar un �mbito de sesi�n cuando la p�gina JSP declara (v�a directiva page) que no participa en sesiones
-jsp.error.xml.encodingByteOrderUnsupported=El orden de byte dado para encoding \"{0}\" no est� soportado
-jsp.error.xml.encodingDeclInvalid=Nombre de codificaci�n \"{0}\" incorrecto.
-jsp.error.xml.encodingDeclRequired=Se necesita la declaraci�n encoding en la declaraci�n de texto
-jsp.error.xml.morePseudoAttributes=se esperan m�s pseudo-atributos
-jsp.error.xml.noMorePseudoAttributes=no se permiten m�s pseudo-atributos.
-jsp.error.xml.versionInfoRequired=Se requiere la versi�n en la declaraci�n XML.
-jsp.error.xml.xmlDeclUnterminated=La declaraci�n XML debe de terminar con \"?>\".
-jsp.error.xml.reservedPITarget=La instrucci�n de procesamiento que coincide con \"[xX][mM][lL]\" no est� permitida.
-jsp.error.xml.spaceRequiredInPI=Se necesita un espacio en blanco entre la instrucci�n de procesamiento y los datos.
-jsp.error.xml.invalidCharInContent=Un car�cter XML incorrecto (Unicode: 0x{0}) se hall� en el contenido del elemento del documento.
-jsp.error.xml.spaceRequiredBeforeStandalone=Se necesita un espacio en blanco antes del pseudo-atributo encoding en la declaraci�n XML.
-jsp.error.xml.sdDeclInvalid=El valor de declaraci�n de documento standalone debe de ser \"yes\" o \"no\", no \"{0}\".
-jsp.error.xml.invalidCharInPI=Se hall� un car�cter XML incorrecto (Unicode: 0x{0}) en la instrucci�n de procesamiento
-jsp.error.xml.versionNotSupported=No se soporta la versi�n XML \"{0}\", s�lo se soporta XML 1.0
-jsp.error.xml.pseudoAttrNameExpected=se esperaba un pseudo-atributo name.
-jsp.error.xml.expectedByte=Se esperaba byte {0} de {1}-byte de secuencia UTF-8.
-jsp.error.xml.invalidByte=Incorrecto byte {0} de {1}-byte de secuencia UTF-8.
-jsp.error.xml.operationNotSupported=La operaci�n \"{0}\" no est� soportada por lector {1}.
-jsp.error.xml.invalidHighSurrogate=Surrogaci�n Alta de bits en secuencia UTF-8 no debe de exceder 0x10, pero se hall� 0x{0}.
-jsp.error.xml.invalidASCII=El Byte \"{0}\" no es ASCII de 7-bit.
-jsp.error.xml.spaceRequiredBeforeEncodingInXMLDecl=Se necesita espacio en blanco antes del pseudo-atributo encoding en la declaraci�n XML.
-jsp.error.xml.spaceRequiredBeforeEncodingInTextDecl=Se necesita espacio en blanco antes del pseudo-atributo encoding en la declaraci�n text.
-jsp.error.xml.spaceRequiredBeforeVersionInTextDecl=Se necesita espacio en blanco antes del pseudo-atributo version en la declaraci�n text.
-jsp.error.xml.spaceRequiredBeforeVersionInXMLDecl=Se necesita espacio en blanco antes del pseudo-atributo version en la declaraci�n XML.
-jsp.error.xml.eqRequiredInXMLDecl=El car�cter '' = '' debe de serguir a \"{0}\" en la declaraci�n XML.
-jsp.error.xml.eqRequiredInTextDecl=El car�cter '' = '' debe de serguir a \"{0}\" en la declaraci�n text.
-jsp.error.xml.quoteRequiredInTextDecl=El valor que sigue a \"{0}\" en la declaraci�n text debe de ser una cadena entre comillas.
-jsp.error.xml.quoteRequiredInXMLDecl=El valor que sigue a \"{0}\" en la declaraci�n XML debe de ser un cadena entre comillas.
-jsp.error.xml.invalidCharInTextDecl=Un car�cter XML incorrecto (Unicode: 0x{0}) se hall� en la declaraci�n text
-jsp.error.xml.invalidCharInXMLDecl=Un car�cter XML incorrecto (Unicode: 0x{0}) se hall� en la declaraci�n XML
-jsp.error.xml.closeQuoteMissingInTextDecl=Faltan las comillas de cierre en el valor que sigue a \"{0}\" en la declaraci�n text.
-jsp.error.xml.closeQuoteMissingInXMLDecl=Faltan las comillas de cierre en el valor que sigue a \"{0}\" en la declaraci�n XML.
-jsp.error.multiple.jsp=No puedo tener m�ltiples especificaciones de
-jsp.error.jspoutput.conflict=<jsp:output>: ilegal tener ocurrencias m�ltiples de \"{0}\" con diferentes valores (viejo: {1}, nuevo: {2})
-jsp.error.jspoutput.doctypenamesystem=<jsp:output>: atributos 'doctype-root-element' y 'doctype-system' deben de aparecer juntos
-jsp.error.jspoutput.doctypepulicsystem=<jsp:output>: atributo 'doctype-system' debe de aparecer si aparece atributo 'doctype-public'
-jsp.error.jspoutput.nonemptybody=<jsp:output> no debe de tener un cuerpo
-jsp.error.jspoutput.invalidUse=<jsp:output> no se debe de usar en sint�xis est�ndar
+jsp.error.single.line.number = Ha tenido lugar un error en la l\u00EDnea\: {0} en el archivo jsp\: {1}
+jsp.error.multiple.line.number = \n\
+ \n\
+ Ha tenido lugar un error entre las l\u00EDneas\: {0} y {1} en el archivo jsp\: {2}\n\
+ \n
+jsp.error.java.line.number = Ha tenido lugar un error en la l\u00EDnea\: {0} en el fichero java generado
+jsp.error.corresponding.servlet = Error de servlet generado\:\n
+jsp.error.empty.body.not.allowed = Cuerpo vac\u00EDo no permitido para {0}
+jsp.error.jspbody.required = Se debe de usar jsp\:body para especificar cuerpo tag para {0} si se usa jsp\:attribute.
+jsp.error.jspbody.emptybody.only = El tag {0} s\u00F3lo puede tener jsp\:attribute en su cuerpo.
+jsp.error.no.scriptlets = Los elementos de Scripting (<%\!, <jsp\:declaration, <%\=, <jsp\:expression, <%, <jsp\:scriptlet ) no est\u00E1n permitidos aqu\u00ED.
+jsp.error.internal.unexpected_node_type = Error Interno\: Encontrado tipo de nodo inesperado
+jsp.error.tld.fn.invalid.signature = Sint\u00E1xis incorrecta para firma de funci\u00F3n en TLD. Biblioteca de Tag\: {0}, Funci\u00F3n\: {1}
+jsp.error.tld.fn.duplicate.name = Nombre duplicado de funci\u00F3n {0} en biblioteca de tag {1}
+jsp.error.tld.fn.invalid.signature.commaexpected = Sint\u00E1xis incorrecta para firma de funci\u00F3n en TLD. Se esperaba Coma ','. Biblioteca de Tag\: {0}, Funci\u00F3n\: {1}.
+jsp.error.tld.fn.invalid.signature.parenexpected = Sint\u00E1xis incorrecta para firma de funci\u00F3n en TLD. Se esperaba Par\u00E9ntesis '('. Biblioteca de Tag\: {0}, Funci\u00F3n\: {1}.
+jsp.error.tld.mandatory.element.missing = Falta o est\u00E1 vac\u00EDo elemento TLD obligatorio\: {0}
+jsp.error.dynamic.attributes.not.implemented = El tag {0} declara que acepta atributos din\u00E1micos pero no implementa la interfaz requerida
+jsp.error.nomatching.fragment = No puedo hallar una directiva de atributo (con name\={0} y fragment\=true) antes de la directiva de fragment.
+jsp.error.attribute.noequal = se esperaba s\u00EDmbolo igual
+jsp.error.attribute.noquote = se esperaba s\u00EDmbolo comillas
+jsp.error.attribute.unterminated = el atributo para {0} no est\u00E1 terminado correctamente
+jsp.error.attribute.noescape = El valor de atributo {0} est\u00E1 entrecomillado con {1} que debe de usar escape al usarse dentro del valor
+jsp.error.missing.tagInfo = El objeto TagInfo para {0} falta del TLD
+jsp.error.deferredmethodsignaturewithoutdeferredmethod = No puedo especificar firma de m\u00E9todo si 'deferredMethod' no es 'verdadero'
+jsp.error.deferredvaluetypewithoutdeferredvalue = No puedo especificar un tipo de valor si 'deferredValue' no es 'verdadero'
+jsp.error.deferredmethodandvalue = 'deferredValue' y 'deferredMethod' no pueden ser ambos 'verdadero'
+jsp.error.fragmentwithtype = No puede especificar ambos atributos 'fragment' y 'type'. Si est\u00E1 presente 'fragment', 'type' se pone como 'javax.servlet.jsp.tagext.JspFragment'
+jsp.error.fragmentwithrtexprvalue = No puede especificar ambos atributos 'fragment' y 'rtexprvalue'. Si est\u00E1 presente 'fragment', 'rtexprvalue' se pone como 'true'
+jsp.error.fragmentWithDeclareOrScope = Ambos atributos 'fragment' y 'declare' o 'scope' se han especificado en la directiva variable
+jsp.error.var_and_varReader = S\u00F3lo se puede especificar uno de 'var' o 'varReader'
+jsp.error.missing_var_or_varReader = Falta atributo 'var' o 'varReader'
+jsp.warning.bad.urlpattern.propertygroup = Valor malo {0} en el subelemento url-pattern en web.xml
+jsp.error.unknown_attribute_type = Tipo de atributo desconocido ({1}) para atributo {0}.
+jsp.error.coerce_to_type = No puedo coaccionar el valor ({2}) a tipo ({1}) para atributo {0}.
+jsp.error.jspelement.missing.name = Falta atributo obligatorio XML-style 'name'
+jsp.error.xmlns.redefinition.notimplemented = Error interno\: Intento de redefinir xmlns\:{0}. La redefinici\u00F3n de espacios de nombre no est\u00E1 implementada.
+jsp.error.could.not.add.taglibraries = No pude a\u00F1adir una o m\u00E1s bibliotecas.
+jsp.error.duplicate.name.jspattribute = El atributo {0} especificado en la acci\u00F3n standard o custom tambi\u00E9n aparece como el valor del atributo name en jsp\:attribute
+jsp.error.not.in.template = {0} no permitido en una plantilla cuerpo de texto.
+jsp.error.badStandardAction = Acci\u00F3n est\u00E1ndar incorrecta
+jsp.error.xml.badStandardAction = Acci\u00F3n est\u00E1ndar incorrecta\: {0}
+jsp.error.tagdirective.badbodycontent = body-content incorrecto ({0}) en directiva tag
+jsp.error.simpletag.badbodycontent = El TLD para la clase {0} especifica un body-content es incorrecto (JSP) para un SimpleTag.
+jsp.error.config_pagedir_encoding_mismatch = El Page-encoding especificado en jsp-property-group ({0}) es diferente del especificado en la diectiva page ({1})
+jsp.error.prolog_pagedir_encoding_mismatch = El Page-encoding especificado en XML prolog ({0}) difiere del especificado en la directiva page ({1})
+jsp.error.prolog_config_encoding_mismatch = El Page-encoding especificado en XML prolog ({0}) difiere del especificado en jsp-property-group ({1})
+jsp.error.attribute.custom.non_rt_with_expr = Seg\u00FAn el TLD o la directiva attribute del archivo tag, el atributo {0} no acepta expresiones
+jsp.error.attribute.standard.non_rt_with_expr = El atributo {0} de la acci\u00F3n est\u00E1ndar {1} no acepta expresiones
+jsp.error.scripting.variable.missing_name = Imposible determinar nombre de variable de scripting desde atributo {0}
+jasper.error.emptybodycontent.nonempty = Seg\u00FAn el TLD, el tag {0} debe de estar vac\u00EDo, pero no lo est\u00E1
+jsp.error.tagfile.nameNotUnique = El valor de {0} y el valor de {1} en la l\u00EDnea {2} son el mismo.
+jsp.error.tagfile.nameFrom.noAttribute = No puedo hallar una directiva attribute con un atributo name con un valor "{0}", el valor de este atributo name-from-attribute.
+jsp.error.tagfile.nameFrom.badAttribute = La directiva attribute (declarada en la l\u00EDnea {1} y cuyo atributo name es "{0}", el valor de este atributo name-from-attribute attribute) debe de ser del tipo java.lang.String, es "required" y no un "rtexprvalue".
+jsp.error.page.noSession = No puedo acceder al \u00E1mbito de sesi\u00F3n en una p\u00E1gina que no participa en una sesi\u00F3n
+jsp.error.usebean.noSession = Es ilegal para useBean el usar \u00E1mbito de sesi\u00F3n cuando la p\u00E1gina JSP declara (v\u00EDa directiva de p\u00E1gina) que no participa en sesiones
+jsp.error.xml.encodingByteOrderUnsupported = El orden de byte dado para encoding "{0}" no est\u00E1 soportado
+jsp.error.xml.encodingDeclInvalid = Nombre de codificaci\u00F3n "{0}" incorrecto.
+jsp.error.xml.encodingDeclRequired = Se necesita la declaraci\u00F3n encoding en la declaraci\u00F3n de texto
+jsp.error.xml.morePseudoAttributes = se esperan m\u00E1s pseudo-atributos
+jsp.error.xml.noMorePseudoAttributes = no se permiten m\u00E1s pseudo-atributos.
+jsp.error.xml.versionInfoRequired = Se requiere la versi\u00F3n en la declaraci\u00F3n XML.
+jsp.error.xml.xmlDeclUnterminated = La declaraci\u00F3n XML debe de terminar con "?>".
+jsp.error.xml.reservedPITarget = La instrucci\u00F3n de procesamiento que coincide con "[xX][mM][lL]" no est\u00E1 permitida.
+jsp.error.xml.spaceRequiredInPI = Se necesita un espacio en blanco entre la instrucci\u00F3n de procesamiento y los datos.
+jsp.error.xml.invalidCharInContent = Un car\u00E1cter XML incorrecto (Unicode\: 0x{0}) se hall\u00F3 en el contenido del elemento del documento.
+jsp.error.xml.spaceRequiredBeforeStandalone = Se necesita un espacio en blanco antes del pseudo-atributo encoding en la declaraci\u00F3n XML.
+jsp.error.xml.sdDeclInvalid = El valor de declaraci\u00F3n de documento standalone debe de ser "yes" o "no", no "{0}".
+jsp.error.xml.invalidCharInPI = Se hall\u00F3 un car\u00E1cter XML incorrecto (Unicode\: 0x{0}) en la instrucci\u00F3n de procesamiento
+jsp.error.xml.versionNotSupported = No se soporta la versi\u00F3n XML "{0}", s\u00F3lo se soporta XML 1.0
+jsp.error.xml.pseudoAttrNameExpected = se esperaba un pseudo-atributo name.
+jsp.error.xml.expectedByte = Se esperaba byte {0} de {1}-byte de secuencia UTF-8.
+jsp.error.xml.invalidByte = Incorrecto byte {0} de {1}-byte de secuencia UTF-8.
+jsp.error.xml.operationNotSupported = La operaci\u00F3n "{0}" no est\u00E1 soportada por lector {1}.
+jsp.error.xml.invalidHighSurrogate = Surrogaci\u00F3n Alta de bits en secuencia UTF-8 no debe de exceder 0x10, pero se hall\u00F3 0x{0}.
+jsp.error.xml.invalidASCII = El Byte "{0}" no es ASCII de 7-bit.
+jsp.error.xml.spaceRequiredBeforeEncodingInXMLDecl = Se necesita espacio en blanco antes del pseudo-atributo encoding en la declaraci\u00F3n XML.
+jsp.error.xml.spaceRequiredBeforeEncodingInTextDecl = Se necesita espacio en blanco antes del pseudo-atributo encoding en la declaraci\u00F3n text.
+jsp.error.xml.spaceRequiredBeforeVersionInTextDecl = Se necesita espacio en blanco antes del pseudo-atributo version en la declaraci\u00F3n text.
+jsp.error.xml.spaceRequiredBeforeVersionInXMLDecl = Se necesita espacio en blanco antes del pseudo-atributo version en la declaraci\u00F3n XML.
+jsp.error.xml.eqRequiredInXMLDecl = El car\u00E1cter '' \= '' debe de serguir a "{0}" en la declaraci\u00F3n XML.
+jsp.error.xml.eqRequiredInTextDecl = El car\u00E1cter '' \= '' debe de serguir a "{0}" en la declaraci\u00F3n text.
+jsp.error.xml.quoteRequiredInTextDecl = El valor que sigue a "{0}" en la declaraci\u00F3n text debe de ser una cadena entre comillas.
+jsp.error.xml.quoteRequiredInXMLDecl = El valor que sigue a "{0}" en la declaraci\u00F3n XML debe de ser un cadena entre comillas.
+jsp.error.xml.invalidCharInTextDecl = Un car\u00E1cter XML incorrecto (Unicode\: 0x{0}) se hall\u00F3 en la declaraci\u00F3n text
+jsp.error.xml.invalidCharInXMLDecl = Un car\u00E1cter XML incorrecto (Unicode\: 0x{0}) se hall\u00F3 en la declaraci\u00F3n XML
+jsp.error.xml.closeQuoteMissingInTextDecl = Faltan las comillas de cierre en el valor que sigue a "{0}" en la declaraci\u00F3n text.
+jsp.error.xml.closeQuoteMissingInXMLDecl = Faltan las comillas de cierre en el valor que sigue a "{0}" en la declaraci\u00F3n XML.
+jsp.error.xml.invalidHighSurrogate = Los bits de surrogaci\u00F3n alta en secuencai UTF-8 no deben de exceder 0x10 pero se hall\u00F3 0x{0}.
+jsp.error.multiple.jsp = No puedo tener m\u00FAltiples especificaciones de
+jsp.error.jspoutput.conflict = <jsp\:output>\: ilegal tener ocurrencias m\u00FAltiples de "{0}" con diferentes valores (viejo\: {1}, nuevo\: {2})
+jsp.error.jspoutput.doctypenamesystem = <jsp\:output>\: atributos 'doctype-root-element' y 'doctype-system' deben de aparecer juntos
+jsp.error.jspoutput.doctypepulicsystem = <jsp\:output>\: atributo 'doctype-system' debe de aparecer si aparece atributo 'doctype-public'
+jsp.error.jspoutput.nonemptybody = <jsp\:output> no debe de tener un cuerpo
+jsp.error.jspoutput.invalidUse = <jsp\:output> no se debe de usar en sint\u00E1xis est\u00E1ndar
jsp.error.attributes.not.allowed = {0} no debe de tener atributos
-jsp.error.tagfile.badSuffix=Falta sufijo \".tag\" en trayectoria de archivo de tag {0}
-jsp.error.tagfile.illegalPath=Trayectoria de archivo de tag: {0}, debe de comenzar con \"/WEB-INF/tags\" o \"/META-INF/tags\"
-jsp.error.plugin.wrongRootElement=El nombre del elemento ra�z en {0} difiere de {1}
-jsp.error.attribute.invalidPrefix=El prefijo de atributo {0} no se correponde con ninguna biblioteca importada
-jsp.error.nested.jspattribute=Una acci�n est�ndar jsp:attribute no puede estar anidada dentro de otra acci�n est�ndar jsp:attribute
-jsp.error.nested.jspbody=Una acci�n est�ndar jsp:body no puede estar anidada dentro de otra acci�n est�ndar jsp:body o jsp:attribute
-jsp.error.variable.either.name=O el atributo name-given o name-from-attribute deben de ser especificados en una directiva variable
-jsp.error.variable.both.name=No se puede especificar ambos atributos name-given o name-from-attribute en una directiva variable
-jsp.error.variable.alias=Ambos atributos o ninguno de name-from-attribute y alias pueden ser especificados en una directiva variable
-jsp.error.attribute.null_name=Nombre de atributo nulo
-jsp.error.jsptext.badcontent=\'<\', cuando aparece en el cuerpo de <jsp:text>, debe de estar encapsulado dentro de un CDATA
-jsp.error.jsproot.version.invalid=N�mero incorrecto de versi�n: \"{0}\", debe de ser \"1.2\" o \"2.0\" o \"2.1\"
-jsp.error.noFunctionPrefix=La funci�n {0} debe de usarse con un prefijo cuando no se especifica un espacio de nombres por defecto
-jsp.error.noFunction=La funci�n {0} no puede ser localizada mediante el prefijo especificado
-jsp.error.noFunctionMethod=El m�todo \"{0}\" para la funci�n \"{1}\" no se pudo hallar en la clase \"{2}\"
-jsp.error.function.classnotfound=La clase {0} especificada en el TLD para la funci�n {1} no se puede hallar: {2}
-jsp.error.signature.classnotfound=La clase {0} especificada en la firma del m�todo en el TLD para la funci�n {1} no se puede hallar. {2}
-jsp.error.text.has_subelement=<jsp:text> no debe de tener subelementos
-jsp.error.data.file.read=Error leyendo archivo \"{0}\"
-jsp.error.prefix.refined=Intento de redefinir el prefijo {0} por {1}, cuando ya estaba definido como {2} en el �mbito en curso.
-jsp.error.nested_jsproot=<jsp:root> anidado
-jsp.error.unbalanced.endtag=El tgag final \"</{0}\" est� desequilibrado
-jsp.error.invalid.bean=
+jsp.error.tagfile.badSuffix = Falta sufijo ".tag" en trayectoria de archivo de tag {0}
+jsp.error.tagfile.illegalPath = Trayectoria de archivo de tag\: {0}, debe de comenzar con "/WEB-INF/tags" o "/META-INF/tags"
+jsp.error.plugin.wrongRootElement = El nombre del elemento ra\u00EDz en {0} difiere de {1}
+jsp.error.attribute.invalidPrefix = El prefijo de atributo {0} no se correponde con ninguna biblioteca importada
+jsp.error.nested.jspattribute = Una acci\u00F3n est\u00E1ndar jsp\:attribute no puede estar anidada dentro de otra acci\u00F3n est\u00E1ndar jsp\:attribute
+jsp.error.nested.jspbody = Una acci\u00F3n est\u00E1ndar jsp\:body no puede estar anidada dentro de otra acci\u00F3n est\u00E1ndar jsp\:body o jsp\:attribute
+jsp.error.variable.either.name = O el atributo name-given o name-from-attribute deben de ser especificados en una directiva variable
+jsp.error.variable.both.name = No se puede especificar ambos atributos name-given o name-from-attribute en una directiva variable
+jsp.error.variable.alias = Ambos atributos o ninguno de name-from-attribute y alias pueden ser especificados en una directiva variable
+jsp.error.attribute.null_name = Nombre de atributo nulo
+jsp.error.jsptext.badcontent = '<', cuando aparece en el cuerpo de <jsp\:text>, debe de estar encapsulado dentro de un CDATA
+jsp.error.jsproot.version.invalid = N\u00FAmero incorrecto de versi\u00F3n\: "{0}", debe de ser "1.2" o "2.0" o "2.1"
+jsp.error.noFunctionPrefix = La funci\u00F3n {0} debe de usarse con un prefijo cuando no se especifica un espacio de nombres por defecto
+jsp.error.noFunction = La funci\u00F3n {0} no puede ser localizada mediante el prefijo especificado
+jsp.error.noFunctionMethod = El m\u00E9todo "{0}" para la funci\u00F3n "{1}" no se pudo hallar en la clase "{2}"
+jsp.error.function.classnotfound = La clase {0} especificada en el TLD para la funci\u00F3n {1} no se puede hallar\: {2}
+jsp.error.signature.classnotfound = La clase {0} especificada en la firma del m\u00E9todo en el TLD para la funci\u00F3n {1} no se puede hallar. {2}
+jsp.error.text.has_subelement = <jsp\:text> no debe de tener subelementos
+jsp.error.data.file.read = Error leyendo archivo "{0}"
+jsp.error.prefix.refined = Intento de redefinir el prefijo {0} por {1}, cuando ya estaba definido como {2} en el \u00E1mbito en curso.
+jsp.error.nested_jsproot = <jsp\:root> anidado
+jsp.error.unbalanced.endtag = El tgag final "</{0}" est\u00E1 desequilibrado
+jsp.error.invalid.bean = El valor el atributo de clsae useBean {0} es inv\u00E1lido.
+jsp.error.prefix.use_before_dcl = El prefijo {0} especificado en esta directiva de marca ha sido usado previamente mediante un fichero de acci\u00F3n {1} l\u00EDnea {2}.
+jsp.exception = Ha sucedido una excepci\u00F3n al procesar la p\u00E1gina JSP {0} en l\u00EDnea {1}
+jsp.error.el.template.deferred = \#{..} no est\u00E1 permitido en texto de plantilla
+jsp.error.el.parse = {0} \: {1}
+jsp.error.page.invalid.deferredsyntaxallowedasliteral = Directiva de p\u00E1gina\: valor inv\u00E1lido para deferredSyntaxAllowedAsLiteral
+jsp.error.tag.invalid.deferredsyntaxallowedasliteral = Directiva de marca\: valor inv\u00E1lido para deferredSyntaxAllowedAsLiteral
+jsp.error.page.conflict.deferredsyntaxallowedasliteral = Directiva de p\u00E1gina\: es ilegal tener m\u00FAltiples ocurrencias de 'deferredSyntaxAllowedAsLiteral' con diferentes valores (viejo\: {0}, nuevo\: {1})
+jsp.error.tag.conflict.deferredsyntaxallowedasliteral = Directiva de marca\: es ilegal tener m\u00FAltiples ocurrencias de 'deferredSyntaxAllowedAsLiteral' con diferentes valores (viejo\: {0}, nuevo\: {1})
+jsp.error.page.invalid.trimdirectivewhitespaces = Directiva de p\u00E1gina\: valor inv\u00E1lido para trimDirectiveWhitespaces
+jsp.error.tag.invalid.trimdirectivewhitespaces = Directiva de marca\: valor inv\u00E1lido para trimDirectiveWhitespaces
+jsp.error.page.conflict.trimdirectivewhitespaces = Directiva de p\u00E1gina\: es ilegal tener m\u00FAltiples ocurrencias de 'trimDirectivewhitespaces' con diferentes valores (viejo\: {0}, nuevo\: {1})
+jsp.error.tag.conflict.trimdirectivewhitespaces = Directiva de marca\: es ilegal tener m\u00FAltiples ocurrencias de 'trimDirectivewhitespaces' con diferentes valores (viejo\: {0}, nuevo\: {1})
Modified: trunk/java/org/apache/naming/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/naming/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/naming/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,16 +1,28 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
# $Id$
-
# language es
-
# package org.apache.naming
-
-
-contextBindings.unknownContext=Contexto {0} desconocido
-contextBindings.noContextBoundToThread=No hay contexto de nombres asociado a este hilo
-selectorContext.noJavaUrl=Este contexto debe de ser accedido a traves de una URL de tipo java:
-namingContext.contextExpected=El nombre no esta asociado a ningun Contexto
-namingContext.nameNotBound=El nombre {0} no este asociado a este contexto
-namingContext.readOnly=El contexto es de solo lectura
-namingContext.invalidName=Nombre no valido
-namingContext.noAbsoluteName=No se puede generar un nombre absoluto para este espacio de nombres
-namingContext.alreadyBound=El nombre {0} este ya asociado en este Contexto
+contextBindings.unknownContext = Contexto {0} desconocido
+contextBindings.noContextBoundToThread = No hay contexto de nombres asociado a este hilo
+contextBindings.noContextBoundToCL = No hay contexto de nombres asociado a este cargador de clase
+selectorContext.noJavaUrl = Este contexto debe de ser accedido a traves de una URL de tipo java\:
+namingContext.contextExpected = El nombre no esta asociado a ningun Contexto
+namingContext.failResolvingReference = Excepci\u00F3n inesperada resolviendo referencia
+namingContext.nameNotBound = El nombre {0} no este asociado a este contexto
+namingContext.readOnly = El contexto es de solo lectura
+namingContext.invalidName = Nombre no valido
+namingContext.alreadyBound = El nombre {0} este ya asociado en este Contexto
+namingContext.noAbsoluteName = No se puede generar un nombre absoluto para este espacio de nombres
Modified: trunk/java/org/apache/naming/resources/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/naming/resources/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/naming/resources/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,20 +1,35 @@
-fileResources.base=El Documento base {0} no existe o no es un directorio legible
-warResources.notWar=Doc base debe de apuntar a un archivo WAR
-warResources.invalidWar=Archivo WAR inv�lido o ilegible: {0}
-jarResources.syntax=Documento base {0} debe de empezar con ''jar:'' y acabar con ''!/''
-resources.alreadyStarted=Ya han sido arrancados los Recursos
-resources.connect=No puedo conectar a documento base {0}
-resources.input=No puedo crear flujo (stream) de entrada para recurso {0}
-resources.notStarted=A�n no han sido arrancados los Recursos
-resources.null=El Documento base no puede ser nulo
-resources.notFound=Recurso {0} no hallado
-resources.path=Trayectoria relativa a contexto {0} debe de comenzar con ''/''
-resources.alreadyBound=El Nombre {0} ya ha sido cambiado (bound) en este Contexto
-resources.bindFailed=Fall� el Cambio (Bind): {0}
-resources.unbindFailed=Fall� el Descambio (Unbind): {0}
-standardResources.alreadyStarted=Ya han sido arrancados los Recursos
-standardResources.directory=El archivo base {0} no es un directorio
-standardResources.exists=El archivo base {0} no existe
-standardResources.notStarted=A�n no han sido arrancados los Recursos
-standardResources.null=El Documento base no puede ser nulo
-standardResources.slash=El Documento base {0} no debe de terminar con una barra
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+fileResources.base = El Documento base {0} no existe o no es un directorio legible
+fileResources.listingNull = No pude obtener lista de directorio para {0}
+warResources.notWar = Doc base debe de apuntar a un archivo WAR
+warResources.invalidWar = Archivo WAR inv\u00E1lido o ilegible\: {0}
+jarResources.syntax = Documento base {0} debe de empezar con ''jar\:'' y acabar con ''\!/''
+resources.alreadyStarted = Ya han sido arrancados los Recursos
+resources.connect = No puedo conectar a documento base {0}
+resources.input = No puedo crear flujo (stream) de entrada para recurso {0}
+resources.notStarted = A\u00FAn no han sido arrancados los Recursos
+resources.null = El Documento base no puede ser nulo
+resources.notFound = Recurso {0} no hallado
+resources.path = Trayectoria relativa a contexto {0} debe de comenzar con ''/''
+resources.alreadyBound = El Nombre {0} ya ha sido cambiado (bound) en este Contexto
+resources.bindFailed = Fall\u00F3 el Cambio (Bind)\: {0}
+resources.unbindFailed = Fall\u00F3 el Descambio (Unbind)\: {0}
+standardResources.alreadyStarted = Ya han sido arrancados los Recursos
+standardResources.directory = El archivo base {0} no es un directorio
+standardResources.exists = El archivo base {0} no existe
+standardResources.notStarted = A\u00FAn no han sido arrancados los Recursos
+standardResources.null = El Documento base no puede ser nulo
+standardResources.slash = El Documento base {0} no debe de terminar con una barra
Modified: trunk/java/org/apache/tomcat/util/buf/res/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/tomcat/util/buf/res/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/tomcat/util/buf/res/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
hexUtil.bad=D�gito hexadecimal incorrecto
hexUtil.odd=N�mero de d�gitos hexadecimales incorrecto
httpDate.pe=formato de fecha no v�lido: {0}
Modified: trunk/java/org/apache/tomcat/util/http/res/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/tomcat/util/http/res/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/tomcat/util/http/res/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
# HttpMessages
sc.100=Continuar
sc.101=Cambiando Protocolos
Modified: trunk/java/org/apache/tomcat/util/net/jsse/res/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/tomcat/util/net/jsse/res/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/tomcat/util/net/jsse/res/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1 +1,16 @@
-jsse.alias_no_key_entry=El nombre de Alias {0} no identifica una entrada de clave
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+jsse.alias_no_key_entry = El nombre de Alias {0} no identifica una entrada de clave
+jsse.keystore_load_failed = No pude cargar almac\u00E9n de claves de tipo {0} con ruta {1} debido a {2}
Modified: trunk/java/org/apache/tomcat/util/net/res/LocalStrings_es.properties
===================================================================
--- trunk/java/org/apache/tomcat/util/net/res/LocalStrings_es.properties 2008-09-19 15:22:38 UTC (rev 788)
+++ trunk/java/org/apache/tomcat/util/net/res/LocalStrings_es.properties 2008-09-22 16:52:37 UTC (rev 789)
@@ -1,6 +1,39 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
# net resources
-endpoint.err.fatal=Punto Final (Endpoint) {0} parado debido a excepci�n: {1}
-endpoint.err.nonfatal=El Punto Final (Endpoint) {0} ignor� excepci�n: {1}
-endpoint.warn.reinit=Reinicializando ServerSocket
-endpoint.warn.restart=Rearrancando punto final (endpoint)
-endpoint.warn.security=Punto Final (Endpoint) {0} con excepci�n de seguridad: {1}
+endpoint.err.fatal = Punto Final (Endpoint) {0} parado debido a excepci\u00F3n\: {1}
+endpoint.err.nonfatal = El Punto Final (Endpoint) {0} ignor\u00F3 excepci\u00F3n\: {1}
+endpoint.warn.reinit = Reinicializando ServerSocket
+endpoint.warn.restart = Rearrancando punto final (endpoint)
+endpoint.warn.security = Punto Final (Endpoint) {0} con excepci\u00F3n de seguridad\: {1}
+endpoint.err.socket = Error de conector causado por m\u00E1quina remota {0}
+endpoint.err.handshake = Acuerdo fallido
+endpoint.err.unexpected = Error inesperado al procesar conector
+endpoint.warn.nullSocket = Conector nulo devuelto por aceptaci\u00F3n
+endpoint.debug.unlock = Excepci\u00F3n cogida intentando desbloquear aceptaci\u00F3n en puerto {0}
+endpoint.err.close = Excepci\u00F3n cogida intentando cerrar conector
+endpoint.noProcessor = No hay procesadores - \u00A1hilo de trabajadir muerto\!
+endpoint.init.bind = Ligado de conector fall\u00F3\: [{0}] {1}
+endpoint.init.listen = Escucha de conector fall\u00F3\: [{0}] {1}
+endpoint.accept.fail = Aceptaci\u00F3n de conector fall\u00F3
+endpoint.poll.limitedpollsize = No pude crear encuestador de medida espec\u00EDfica de {0}
+endpoint.poll.initfail = Fall\u00F3 la creaci\u00F3n del encuestador
+endpoint.poll.fail = Fallo cr\u00EDtico de encuestador (reiniciando encuestador)\: [{0}] {1}
+endpoint.poll.fail = Conector [{0}] evento de encuesta\: [{1}] {2}
+endpoint.poll.error = Error inesperado de encuestador
+endpoint.process.fail = Error reservando procesador de conector
+endpoint.sendfile.error = Error inesperado de env\u00EDo de fichero
+endpoint.sendfile.addfail = Fallo en Sednfile\: [{0}] {1}
+endpoint.sendfile.nosupport = Desactivando sendfile ya que o la versi\u00F3n APR o el sistema no lo soportan
16 years, 5 months
JBossWeb SVN: r788 - in trunk: java/org/apache/jasper/compiler and 1 other directories.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2008-09-19 11:22:38 -0400 (Fri, 19 Sep 2008)
New Revision: 788
Modified:
trunk/java/org/apache/jasper/Constants.java
trunk/java/org/apache/jasper/compiler/Compiler.java
trunk/java/org/apache/jasper/compiler/Generator.java
trunk/java/org/apache/jasper/compiler/JspDocumentParser.java
trunk/java/org/apache/jasper/compiler/JspUtil.java
trunk/java/org/apache/jasper/compiler/Parser.java
trunk/java/org/apache/jasper/compiler/ParserController.java
trunk/java/org/apache/jasper/compiler/Validator.java
trunk/webapps/docs/changelog.xml
Log:
- 45451: Rework escaping of EL.
Modified: trunk/java/org/apache/jasper/Constants.java
===================================================================
--- trunk/java/org/apache/jasper/Constants.java 2008-09-19 02:14:12 UTC (rev 787)
+++ trunk/java/org/apache/jasper/Constants.java 2008-09-19 15:22:38 UTC (rev 788)
@@ -181,13 +181,6 @@
System.getProperty("org.apache.jasper.Constants.TEMP_VARIABLE_NAME_PREFIX", "_jspx_temp");
/**
- * A replacement char for "\$".
- * XXX This is a hack to avoid changing EL interpreter to recognize "\$"
- */
- public static final char ESC = '\u001b';
- public static final String ESCStr = "'\\u001b'";
-
- /**
* Has security been turned on?
*/
public static final boolean IS_SECURITY_ENABLED =
Modified: trunk/java/org/apache/jasper/compiler/Compiler.java
===================================================================
--- trunk/java/org/apache/jasper/compiler/Compiler.java 2008-09-19 02:14:12 UTC (rev 787)
+++ trunk/java/org/apache/jasper/compiler/Compiler.java 2008-09-19 15:22:38 UTC (rev 788)
@@ -146,8 +146,28 @@
ServletWriter writer = null;
try {
+ /*
+ * The setting of isELIgnored changes the behaviour of the parser
+ * in subtle ways. To add to the 'fun', isELIgnored can be set in
+ * any file that forms part of the translation unit so setting it
+ * in a file included towards the end of the translation unit can
+ * change how the parser should have behaved when parsing content
+ * up to the point where isELIgnored was set. Arghh!
+ * Previous attempts to hack around this have only provided partial
+ * solutions. We now use two passes to parse the translation unit.
+ * The first just parses the directives and the second parses the
+ * whole translation unit once we know how isELIgnored has been set.
+ * TODO There are some possible optimisations of this process.
+ */
// Parse the file
ParserController parserCtl = new ParserController(ctxt, this);
+
+ // Pass 1 - the directives
+ Node.Nodes directives =
+ parserCtl.parseDirectives(ctxt.getJspFile());
+ Validator.validateDirectives(this, directives);
+
+ // Pass 2 - the whole translation unit
pageNodes = parserCtl.parse(ctxt.getJspFile());
if (ctxt.isPrototypeMode()) {
@@ -159,8 +179,9 @@
return null;
}
- // Validate and process attributes
- Validator.validate(this, pageNodes);
+ // Validate and process attributes - don't re-validate the
+ // directives we validated in pass 1
+ Validator.validateExDirectives(this, pageNodes);
if (log.isDebugEnabled()) {
t2 = System.currentTimeMillis();
Modified: trunk/java/org/apache/jasper/compiler/Generator.java
===================================================================
--- trunk/java/org/apache/jasper/compiler/Generator.java 2008-09-19 02:14:12 UTC (rev 787)
+++ trunk/java/org/apache/jasper/compiler/Generator.java 2008-09-19 15:22:38 UTC (rev 788)
@@ -806,13 +806,8 @@
}
return v;
} else if (attr.isELInterpreterInput()) {
- boolean replaceESC = v.indexOf(Constants.ESC) > 0;
v = JspUtil.interpreterCall(this.isTagFile, v, expectedType,
attr.getEL().getMapName(), false);
- // XXX ESC replacement hack
- if (replaceESC) {
- v = "(" + v + ").replace(" + Constants.ESCStr + ", '$')";
- }
if (encode) {
return "org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("
+ v + ", request.getCharacterEncoding())";
@@ -2843,16 +2838,10 @@
attrValue = sb.toString();
} else {
// run attrValue through the expression interpreter
- boolean replaceESC = attrValue.indexOf(Constants.ESC) > 0;
String mapName = (attr.getEL() != null) ? attr.getEL()
.getMapName() : null;
attrValue = JspUtil.interpreterCall(this.isTagFile,
attrValue, c[0], mapName, false);
- // XXX hack: Replace ESC with '$'
- if (replaceESC) {
- attrValue = "(" + attrValue + ").replace("
- + Constants.ESCStr + ", '$')";
- }
}
} else {
attrValue = convertString(c[0], attrValue, localName,
Modified: trunk/java/org/apache/jasper/compiler/JspDocumentParser.java
===================================================================
--- trunk/java/org/apache/jasper/compiler/JspDocumentParser.java 2008-09-19 02:14:12 UTC (rev 787)
+++ trunk/java/org/apache/jasper/compiler/JspDocumentParser.java 2008-09-19 15:22:38 UTC (rev 788)
@@ -580,6 +580,9 @@
lastCh = ch;
}
} else if (lastCh == '\\' && (ch == '$' || ch == '#')) {
+ if (pageInfo.isELIgnored()) {
+ ttext.write('\\');
+ }
ttext.write(ch);
ch = 0; // Not start of EL anymore
} else {
Modified: trunk/java/org/apache/jasper/compiler/JspUtil.java
===================================================================
--- trunk/java/org/apache/jasper/compiler/JspUtil.java 2008-09-19 02:14:12 UTC (rev 787)
+++ trunk/java/org/apache/jasper/compiler/JspUtil.java 2008-09-19 15:22:38 UTC (rev 788)
@@ -191,7 +191,7 @@
returnString = expression;
}
- return escapeXml(returnString.replace(Constants.ESC, '$'));
+ return escapeXml(returnString);
}
/**
Modified: trunk/java/org/apache/jasper/compiler/Parser.java
===================================================================
--- trunk/java/org/apache/jasper/compiler/Parser.java 2008-09-19 02:14:12 UTC (rev 787)
+++ trunk/java/org/apache/jasper/compiler/Parser.java 2008-09-19 15:22:38 UTC (rev 788)
@@ -27,7 +27,6 @@
import javax.servlet.jsp.tagext.TagInfo;
import javax.servlet.jsp.tagext.TagLibraryInfo;
-import org.apache.jasper.Constants;
import org.apache.jasper.JasperException;
import org.apache.jasper.JspCompilationContext;
import org.xml.sax.Attributes;
@@ -264,18 +263,19 @@
private String parseQuoted(Mark start, String tx, char quote)
throws JasperException {
StringBuffer buf = new StringBuffer();
+ boolean possibleEL = tx.contains("${");
int size = tx.length();
int i = 0;
while (i < size) {
char ch = tx.charAt(i);
if (ch == '&') {
if (i + 5 < size && tx.charAt(i + 1) == 'a'
- && tx.charAt(i + 2) == 'p' && tx.charAt(i + 3) == 'o'
+ && tx.charAt(i + 2) == 'p' && tx.charAt(i + 3) == 'o'
&& tx.charAt(i + 4) == 's' && tx.charAt(i + 5) == ';') {
buf.append('\'');
i += 6;
} else if (i + 5 < size && tx.charAt(i + 1) == 'q'
- && tx.charAt(i + 2) == 'u' && tx.charAt(i + 3) == 'o'
+ && tx.charAt(i + 2) == 'u' && tx.charAt(i + 3) == 'o'
&& tx.charAt(i + 4) == 't' && tx.charAt(i + 5) == ';') {
buf.append('"');
i += 6;
@@ -285,13 +285,22 @@
}
} else if (ch == '\\' && i + 1 < size) {
ch = tx.charAt(i + 1);
- if (ch == '\\' || ch == '\"' || ch == '\'' || ch == '>') {
+ if (ch == '\\' || ch == '\"' || ch == '\'') {
+ if (pageInfo.isELIgnored() || !possibleEL) {
+ // EL is not enabled or no chance of EL
+ // Unescape these now
+ buf.append(ch);
+ i += 2;
+ } else {
+ // EL is enabled and ${ appears in value
+ // EL processing will escape these
+ buf.append('\\');
+ buf.append(ch);
+ i += 2;
+ }
+ } else if (ch == '>') {
buf.append(ch);
i += 2;
- } else if (ch == '$') {
- // Replace "\$" with some special char. XXX hack!
- buf.append(Constants.ESC);
- i += 2;
} else {
buf.append('\\');
++i;
Modified: trunk/java/org/apache/jasper/compiler/ParserController.java
===================================================================
--- trunk/java/org/apache/jasper/compiler/ParserController.java 2008-09-19 02:14:12 UTC (rev 787)
+++ trunk/java/org/apache/jasper/compiler/ParserController.java 2008-09-19 15:22:38 UTC (rev 788)
@@ -104,6 +104,23 @@
}
/**
+ * Parses the directives of a JSP page or tag file. This is invoked by the
+ * compiler.
+ *
+ * @param inFileName The path to the JSP page or tag file to be parsed.
+ */
+ public Node.Nodes parseDirectives(String inFileName)
+ throws FileNotFoundException, JasperException, IOException {
+ // If we're parsing a packaged tag file or a resource included by it
+ // (using an include directive), ctxt.getTagFileJar() returns the
+ // JAR file from which to read the tag file or included resource,
+ // respectively.
+ isTagFile = ctxt.isTagFile();
+ directiveOnly = true;
+ return doParse(inFileName, null, ctxt.getTagFileJarUrl());
+ }
+
+ /**
* Processes an include directive with the given path.
*
* @param inFileName The path to the resource to be included.
Modified: trunk/java/org/apache/jasper/compiler/Validator.java
===================================================================
--- trunk/java/org/apache/jasper/compiler/Validator.java 2008-09-19 02:14:12 UTC (rev 787)
+++ trunk/java/org/apache/jasper/compiler/Validator.java 2008-09-19 15:22:38 UTC (rev 788)
@@ -1337,7 +1337,6 @@
}
} else {
- value = value.replace(Constants.ESC, '$');
result = new Node.JspAttribute(tai, qName, uri,
localName, value, false, null, dynamic);
}
@@ -1692,16 +1691,14 @@
}
}
- public static void validate(Compiler compiler, Node.Nodes page)
- throws JasperException {
-
- /*
- * Visit the page/tag directives first, as they are global to the page
- * and are position independent.
- */
+ public static void validateDirectives(Compiler compiler, Node.Nodes page)
+ throws JasperException {
page.visit(new DirectiveVisitor(compiler));
+ }
- // Determine the default output content type
+ public static void validateExDirectives(Compiler compiler, Node.Nodes page)
+ throws JasperException {
+// Determine the default output content type
PageInfo pageInfo = compiler.getPageInfo();
String contentType = pageInfo.getContentType();
Modified: trunk/webapps/docs/changelog.xml
===================================================================
--- trunk/webapps/docs/changelog.xml 2008-09-19 02:14:12 UTC (rev 787)
+++ trunk/webapps/docs/changelog.xml 2008-09-19 15:22:38 UTC (rev 788)
@@ -54,6 +54,11 @@
<fix>
Fix bad EL exception cast. (rjung)
</fix>
+ <fix>
+ <bug>45451</bug>: Testing for this threw up all sorts of other failures around use of \${...} These
+ should all now be fixed. The two pass parsing means we can do away with the previous 'replace with
+ unused unicode character' trick. (markt)
+ </fix>
</changelog>
</subsection>
</section>
16 years, 5 months
JBossWeb SVN: r787 - in trunk: java/org/apache/el/lang and 1 other directories.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2008-09-18 22:14:12 -0400 (Thu, 18 Sep 2008)
New Revision: 787
Modified:
trunk/BUILDING.txt
trunk/java/org/apache/el/lang/ExpressionBuilder.java
trunk/webapps/docs/changelog.xml
Log:
- Fix possible class cast.
Modified: trunk/BUILDING.txt
===================================================================
--- trunk/BUILDING.txt 2008-09-19 02:13:40 UTC (rev 786)
+++ trunk/BUILDING.txt 2008-09-19 02:14:12 UTC (rev 787)
@@ -122,6 +122,6 @@
Download JavaCC 4.1+
export JAVACC_HOME=/somepath/javacc-4.1
export PATH=$JAVACC_HOME/bin:$PATH
- cd java/org/apache/el/parser
+ cd ${jboss-web.source}/java/org/apache/el/parser
jjtree ELParser.jjt
javacc ELParser.jj
Modified: trunk/java/org/apache/el/lang/ExpressionBuilder.java
===================================================================
--- trunk/java/org/apache/el/lang/ExpressionBuilder.java 2008-09-19 02:13:40 UTC (rev 786)
+++ trunk/java/org/apache/el/lang/ExpressionBuilder.java 2008-09-19 02:14:12 UTC (rev 787)
@@ -132,7 +132,11 @@
try {
node.accept(this);
} catch (Exception e) {
- throw (ELException) e;
+ if (e instanceof ELException) {
+ throw (ELException) e;
+ } else {
+ throw (new ELException(e));
+ }
}
if (this.fnMapper instanceof FunctionMapperFactory) {
this.fnMapper = ((FunctionMapperFactory) this.fnMapper).create();
Modified: trunk/webapps/docs/changelog.xml
===================================================================
--- trunk/webapps/docs/changelog.xml 2008-09-19 02:13:40 UTC (rev 786)
+++ trunk/webapps/docs/changelog.xml 2008-09-19 02:14:12 UTC (rev 787)
@@ -48,6 +48,12 @@
<fix>
<bug>45427</bug>: Correct parsing of quoted stings in EL. (markt)
</fix>
+ <fix>
+ Optimize EL parser lookahead. (markt)
+ </fix>
+ <fix>
+ Fix bad EL exception cast. (rjung)
+ </fix>
</changelog>
</subsection>
</section>
16 years, 5 months
JBossWeb SVN: r786 - trunk/java/org/apache/el/parser.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2008-09-18 22:13:40 -0400 (Thu, 18 Sep 2008)
New Revision: 786
Modified:
trunk/java/org/apache/el/parser/ELParser.java
trunk/java/org/apache/el/parser/ELParserConstants.java
trunk/java/org/apache/el/parser/ELParserTokenManager.java
trunk/java/org/apache/el/parser/ELParserTreeConstants.java
trunk/java/org/apache/el/parser/JJTELParserState.java
trunk/java/org/apache/el/parser/ParseException.java
trunk/java/org/apache/el/parser/SimpleCharStream.java
trunk/java/org/apache/el/parser/Token.java
trunk/java/org/apache/el/parser/TokenMgrError.java
Log:
- Regenerated EL parser classes.
Modified: trunk/java/org/apache/el/parser/ELParser.java
===================================================================
--- trunk/java/org/apache/el/parser/ELParser.java 2008-09-19 02:11:27 UTC (rev 785)
+++ trunk/java/org/apache/el/parser/ELParser.java 2008-09-19 02:13:40 UTC (rev 786)
@@ -1,19 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
/* Generated By:JJTree&JavaCC: Do not edit this line. ELParser.java */
package org.apache.el.parser;
import java.io.StringReader;
@@ -41,18 +25,28 @@
try {
label_1:
while (true) {
- if (jj_2_1(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case LITERAL_EXPRESSION:
+ case START_DYNAMIC_EXPRESSION:
+ case START_DEFERRED_EXPRESSION:
;
- } else {
+ break;
+ default:
+ jj_la1[0] = jj_gen;
break label_1;
}
- if (jj_2_2(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case START_DEFERRED_EXPRESSION:
DeferredExpression();
- } else if (jj_2_3(3)) {
+ break;
+ case START_DYNAMIC_EXPRESSION:
DynamicExpression();
- } else if (jj_2_4(3)) {
+ break;
+ case LITERAL_EXPRESSION:
LiteralExpression();
- } else {
+ break;
+ default:
+ jj_la1[1] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -188,7 +182,7 @@
Or();
label_2:
while (true) {
- if (jj_2_5(3)) {
+ if (jj_2_1(3)) {
;
} else {
break label_2;
@@ -196,29 +190,29 @@
jj_consume_token(QUESTIONMARK);
Choice();
jj_consume_token(COLON);
- AstChoice jjtn001 = new AstChoice(JJTCHOICE);
- boolean jjtc001 = true;
- jjtree.openNodeScope(jjtn001);
+ AstChoice jjtn001 = new AstChoice(JJTCHOICE);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
try {
Choice();
} catch (Throwable jjte001) {
- if (jjtc001) {
- jjtree.clearNodeScope(jjtn001);
- jjtc001 = false;
- } else {
- jjtree.popNode();
- }
- if (jjte001 instanceof RuntimeException) {
- {if (true) throw (RuntimeException)jjte001;}
- }
- if (jjte001 instanceof ParseException) {
- {if (true) throw (ParseException)jjte001;}
- }
- {if (true) throw (Error)jjte001;}
+ if (jjtc001) {
+ jjtree.clearNodeScope(jjtn001);
+ jjtc001 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte001 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte001;}
+ }
+ if (jjte001 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte001;}
+ }
+ {if (true) throw (Error)jjte001;}
} finally {
- if (jjtc001) {
- jjtree.closeNodeScope(jjtn001, 3);
- }
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, 3);
+ }
}
}
}
@@ -231,16 +225,24 @@
And();
label_3:
while (true) {
- if (jj_2_6(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case OR0:
+ case OR1:
;
- } else {
+ break;
+ default:
+ jj_la1[2] = jj_gen;
break label_3;
}
- if (jj_2_7(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case OR0:
jj_consume_token(OR0);
- } else if (jj_2_8(3)) {
+ break;
+ case OR1:
jj_consume_token(OR1);
- } else {
+ break;
+ default:
+ jj_la1[3] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -279,16 +281,24 @@
Equality();
label_4:
while (true) {
- if (jj_2_9(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AND0:
+ case AND1:
;
- } else {
+ break;
+ default:
+ jj_la1[4] = jj_gen;
break label_4;
}
- if (jj_2_10(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AND0:
jj_consume_token(AND0);
- } else if (jj_2_11(3)) {
+ break;
+ case AND1:
jj_consume_token(AND1);
- } else {
+ break;
+ default:
+ jj_la1[5] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -327,17 +337,29 @@
Compare();
label_5:
while (true) {
- if (jj_2_12(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case EQ0:
+ case EQ1:
+ case NE0:
+ case NE1:
;
- } else {
+ break;
+ default:
+ jj_la1[6] = jj_gen;
break label_5;
}
- if (jj_2_17(3)) {
- if (jj_2_13(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case EQ0:
+ case EQ1:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case EQ0:
jj_consume_token(EQ0);
- } else if (jj_2_14(3)) {
+ break;
+ case EQ1:
jj_consume_token(EQ1);
- } else {
+ break;
+ default:
+ jj_la1[7] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -365,12 +387,18 @@
jjtree.closeNodeScope(jjtn001, 2);
}
}
- } else if (jj_2_18(3)) {
- if (jj_2_15(3)) {
+ break;
+ case NE0:
+ case NE1:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case NE0:
jj_consume_token(NE0);
- } else if (jj_2_16(3)) {
+ break;
+ case NE1:
jj_consume_token(NE1);
- } else {
+ break;
+ default:
+ jj_la1[8] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -398,7 +426,9 @@
jjtree.closeNodeScope(jjtn002, 2);
}
}
- } else {
+ break;
+ default:
+ jj_la1[9] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -413,17 +443,33 @@
Math();
label_6:
while (true) {
- if (jj_2_19(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case GT0:
+ case GT1:
+ case LT0:
+ case LT1:
+ case GE0:
+ case GE1:
+ case LE0:
+ case LE1:
;
- } else {
+ break;
+ default:
+ jj_la1[10] = jj_gen;
break label_6;
}
- if (jj_2_28(3)) {
- if (jj_2_20(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case LT0:
+ case LT1:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case LT0:
jj_consume_token(LT0);
- } else if (jj_2_21(3)) {
+ break;
+ case LT1:
jj_consume_token(LT1);
- } else {
+ break;
+ default:
+ jj_la1[11] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -451,12 +497,18 @@
jjtree.closeNodeScope(jjtn001, 2);
}
}
- } else if (jj_2_29(3)) {
- if (jj_2_22(3)) {
+ break;
+ case GT0:
+ case GT1:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case GT0:
jj_consume_token(GT0);
- } else if (jj_2_23(3)) {
+ break;
+ case GT1:
jj_consume_token(GT1);
- } else {
+ break;
+ default:
+ jj_la1[12] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -484,12 +536,18 @@
jjtree.closeNodeScope(jjtn002, 2);
}
}
- } else if (jj_2_30(3)) {
- if (jj_2_24(3)) {
+ break;
+ case LE0:
+ case LE1:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case LE0:
jj_consume_token(LE0);
- } else if (jj_2_25(3)) {
+ break;
+ case LE1:
jj_consume_token(LE1);
- } else {
+ break;
+ default:
+ jj_la1[13] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -517,12 +575,18 @@
jjtree.closeNodeScope(jjtn003, 2);
}
}
- } else if (jj_2_31(3)) {
- if (jj_2_26(3)) {
+ break;
+ case GE0:
+ case GE1:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case GE0:
jj_consume_token(GE0);
- } else if (jj_2_27(3)) {
+ break;
+ case GE1:
jj_consume_token(GE1);
- } else {
+ break;
+ default:
+ jj_la1[14] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -550,7 +614,9 @@
jjtree.closeNodeScope(jjtn004, 2);
}
}
- } else {
+ break;
+ default:
+ jj_la1[15] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -565,12 +631,17 @@
Multiplication();
label_7:
while (true) {
- if (jj_2_32(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case PLUS:
+ case MINUS:
;
- } else {
+ break;
+ default:
+ jj_la1[16] = jj_gen;
break label_7;
}
- if (jj_2_33(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case PLUS:
jj_consume_token(PLUS);
AstPlus jjtn001 = new AstPlus(JJTPLUS);
boolean jjtc001 = true;
@@ -596,7 +667,8 @@
jjtree.closeNodeScope(jjtn001, 2);
}
}
- } else if (jj_2_34(3)) {
+ break;
+ case MINUS:
jj_consume_token(MINUS);
AstMinus jjtn002 = new AstMinus(JJTMINUS);
boolean jjtc002 = true;
@@ -622,7 +694,9 @@
jjtree.closeNodeScope(jjtn002, 2);
}
}
- } else {
+ break;
+ default:
+ jj_la1[17] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -637,12 +711,20 @@
Unary();
label_8:
while (true) {
- if (jj_2_35(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case MULT:
+ case DIV0:
+ case DIV1:
+ case MOD0:
+ case MOD1:
;
- } else {
+ break;
+ default:
+ jj_la1[18] = jj_gen;
break label_8;
}
- if (jj_2_40(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case MULT:
jj_consume_token(MULT);
AstMult jjtn001 = new AstMult(JJTMULT);
boolean jjtc001 = true;
@@ -668,12 +750,18 @@
jjtree.closeNodeScope(jjtn001, 2);
}
}
- } else if (jj_2_41(3)) {
- if (jj_2_36(3)) {
+ break;
+ case DIV0:
+ case DIV1:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case DIV0:
jj_consume_token(DIV0);
- } else if (jj_2_37(3)) {
+ break;
+ case DIV1:
jj_consume_token(DIV1);
- } else {
+ break;
+ default:
+ jj_la1[19] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -701,12 +789,18 @@
jjtree.closeNodeScope(jjtn002, 2);
}
}
- } else if (jj_2_42(3)) {
- if (jj_2_38(3)) {
+ break;
+ case MOD0:
+ case MOD1:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case MOD0:
jj_consume_token(MOD0);
- } else if (jj_2_39(3)) {
+ break;
+ case MOD1:
jj_consume_token(MOD1);
- } else {
+ break;
+ default:
+ jj_la1[20] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -734,7 +828,9 @@
jjtree.closeNodeScope(jjtn003, 2);
}
}
- } else {
+ break;
+ default:
+ jj_la1[21] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -746,7 +842,8 @@
* For '-' '!' 'not' 'empty', then Value
*/
final public void Unary() throws ParseException {
- if (jj_2_45(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case MINUS:
jj_consume_token(MINUS);
AstNegative jjtn001 = new AstNegative(JJTNEGATIVE);
boolean jjtc001 = true;
@@ -772,12 +869,18 @@
jjtree.closeNodeScope(jjtn001, true);
}
}
- } else if (jj_2_46(3)) {
- if (jj_2_43(3)) {
+ break;
+ case NOT0:
+ case NOT1:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case NOT0:
jj_consume_token(NOT0);
- } else if (jj_2_44(3)) {
+ break;
+ case NOT1:
jj_consume_token(NOT1);
- } else {
+ break;
+ default:
+ jj_la1[22] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -805,7 +908,8 @@
jjtree.closeNodeScope(jjtn002, true);
}
}
- } else if (jj_2_47(3)) {
+ break;
+ case EMPTY:
jj_consume_token(EMPTY);
AstEmpty jjtn003 = new AstEmpty(JJTEMPTY);
boolean jjtc003 = true;
@@ -831,9 +935,19 @@
jjtree.closeNodeScope(jjtn003, true);
}
}
- } else if (jj_2_48(3)) {
+ break;
+ case INTEGER_LITERAL:
+ case FLOATING_POINT_LITERAL:
+ case STRING_LITERAL:
+ case TRUE:
+ case FALSE:
+ case NULL:
+ case LPAREN:
+ case IDENTIFIER:
Value();
- } else {
+ break;
+ default:
+ jj_la1[23] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -851,9 +965,13 @@
ValuePrefix();
label_9:
while (true) {
- if (jj_2_49(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case DOT:
+ case LBRACK:
;
- } else {
+ break;
+ default:
+ jj_la1[24] = jj_gen;
break label_9;
}
ValueSuffix();
@@ -884,11 +1002,21 @@
* For Literals, Variables, and Functions
*/
final public void ValuePrefix() throws ParseException {
- if (jj_2_50(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case INTEGER_LITERAL:
+ case FLOATING_POINT_LITERAL:
+ case STRING_LITERAL:
+ case TRUE:
+ case FALSE:
+ case NULL:
Literal();
- } else if (jj_2_51(3)) {
+ break;
+ case LPAREN:
+ case IDENTIFIER:
NonLiteral();
- } else {
+ break;
+ default:
+ jj_la1[25] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -899,11 +1027,15 @@
* Either dot or bracket notation
*/
final public void ValueSuffix() throws ParseException {
- if (jj_2_52(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case DOT:
DotSuffix();
- } else if (jj_2_53(3)) {
+ break;
+ case LBRACK:
BracketSuffix();
- } else {
+ break;
+ default:
+ jj_la1[26] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -970,17 +1102,27 @@
* For Grouped Operations, Identifiers, and Functions
*/
final public void NonLiteral() throws ParseException {
- if (jj_2_54(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case LPAREN:
jj_consume_token(LPAREN);
Expression();
jj_consume_token(RPAREN);
- } else if (jj_2_55(2147483647)) {
- Function();
- } else if (jj_2_56(3)) {
- Identifier();
- } else {
- jj_consume_token(-1);
- throw new ParseException();
+ break;
+ default:
+ jj_la1[27] = jj_gen;
+ if (jj_2_2(2147483647)) {
+ Function();
+ } else {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case IDENTIFIER:
+ Identifier();
+ break;
+ default:
+ jj_la1[28] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
}
}
@@ -1016,7 +1158,7 @@
jjtree.openNodeScope(jjtn000);Token t0 = null;
Token t1 = null;
try {
- if (jj_2_57(3)) {
+ if (jj_2_3(2)) {
t0 = jj_consume_token(IDENTIFIER);
jj_consume_token(COLON);
} else {
@@ -1030,19 +1172,36 @@
jjtn000.setLocalName(t1.image);
}
jj_consume_token(LPAREN);
- if (jj_2_59(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case INTEGER_LITERAL:
+ case FLOATING_POINT_LITERAL:
+ case STRING_LITERAL:
+ case TRUE:
+ case FALSE:
+ case NULL:
+ case LPAREN:
+ case NOT0:
+ case NOT1:
+ case EMPTY:
+ case MINUS:
+ case IDENTIFIER:
Expression();
label_10:
while (true) {
- if (jj_2_58(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case COMMA:
;
- } else {
+ break;
+ default:
+ jj_la1[29] = jj_gen;
break label_10;
}
jj_consume_token(COMMA);
Expression();
}
- } else {
+ break;
+ default:
+ jj_la1[30] = jj_gen;
;
}
jj_consume_token(RPAREN);
@@ -1072,17 +1231,25 @@
* Reserved Keywords
*/
final public void Literal() throws ParseException {
- if (jj_2_60(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case TRUE:
+ case FALSE:
Boolean();
- } else if (jj_2_61(3)) {
+ break;
+ case FLOATING_POINT_LITERAL:
FloatingPoint();
- } else if (jj_2_62(3)) {
+ break;
+ case INTEGER_LITERAL:
Integer();
- } else if (jj_2_63(3)) {
+ break;
+ case STRING_LITERAL:
String();
- } else if (jj_2_64(3)) {
+ break;
+ case NULL:
Null();
- } else {
+ break;
+ default:
+ jj_la1[31] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1093,7 +1260,8 @@
* For 'true' 'false'
*/
final public void Boolean() throws ParseException {
- if (jj_2_65(3)) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case TRUE:
AstTrue jjtn001 = new AstTrue(JJTTRUE);
boolean jjtc001 = true;
jjtree.openNodeScope(jjtn001);
@@ -1104,7 +1272,8 @@
jjtree.closeNodeScope(jjtn001, true);
}
}
- } else if (jj_2_66(3)) {
+ break;
+ case FALSE:
AstFalse jjtn002 = new AstFalse(JJTFALSE);
boolean jjtc002 = true;
jjtree.openNodeScope(jjtn002);
@@ -1115,7 +1284,9 @@
jjtree.closeNodeScope(jjtn002, true);
}
}
- } else {
+ break;
+ default:
+ jj_la1[32] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -1223,1140 +1394,506 @@
finally { jj_save(2, xla); }
}
- private boolean jj_2_4(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_4(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(3, xla); }
+ private boolean jj_3R_24() {
+ if (jj_3R_30()) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_31()) { jj_scanpos = xsp; break; }
+ }
+ return false;
}
- private boolean jj_2_5(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_5(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(4, xla); }
+ private boolean jj_3R_12() {
+ if (jj_scan_token(IDENTIFIER)) return true;
+ if (jj_scan_token(COLON)) return true;
+ return false;
}
- private boolean jj_2_6(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_6(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(5, xla); }
- }
-
- private boolean jj_2_7(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_7(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(6, xla); }
- }
-
- private boolean jj_2_8(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_8(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(7, xla); }
- }
-
- private boolean jj_2_9(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_9(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(8, xla); }
- }
-
- private boolean jj_2_10(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_10(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(9, xla); }
- }
-
- private boolean jj_2_11(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_11(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(10, xla); }
- }
-
- private boolean jj_2_12(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_12(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(11, xla); }
- }
-
- private boolean jj_2_13(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_13(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(12, xla); }
- }
-
- private boolean jj_2_14(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_14(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(13, xla); }
- }
-
- private boolean jj_2_15(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_15(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(14, xla); }
- }
-
- private boolean jj_2_16(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_16(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(15, xla); }
- }
-
- private boolean jj_2_17(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_17(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(16, xla); }
- }
-
- private boolean jj_2_18(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_18(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(17, xla); }
- }
-
- private boolean jj_2_19(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_19(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(18, xla); }
- }
-
- private boolean jj_2_20(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_20(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(19, xla); }
- }
-
- private boolean jj_2_21(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_21(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(20, xla); }
- }
-
- private boolean jj_2_22(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_22(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(21, xla); }
- }
-
- private boolean jj_2_23(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_23(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(22, xla); }
- }
-
- private boolean jj_2_24(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_24(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(23, xla); }
- }
-
- private boolean jj_2_25(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_25(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(24, xla); }
- }
-
- private boolean jj_2_26(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_26(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(25, xla); }
- }
-
- private boolean jj_2_27(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_27(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(26, xla); }
- }
-
- private boolean jj_2_28(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_28(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(27, xla); }
- }
-
- private boolean jj_2_29(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_29(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(28, xla); }
- }
-
- private boolean jj_2_30(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_30(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(29, xla); }
- }
-
- private boolean jj_2_31(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_31(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(30, xla); }
- }
-
- private boolean jj_2_32(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_32(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(31, xla); }
- }
-
- private boolean jj_2_33(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_33(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(32, xla); }
- }
-
- private boolean jj_2_34(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_34(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(33, xla); }
- }
-
- private boolean jj_2_35(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_35(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(34, xla); }
- }
-
- private boolean jj_2_36(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_36(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(35, xla); }
- }
-
- private boolean jj_2_37(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_37(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(36, xla); }
- }
-
- private boolean jj_2_38(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_38(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(37, xla); }
- }
-
- private boolean jj_2_39(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_39(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(38, xla); }
- }
-
- private boolean jj_2_40(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_40(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(39, xla); }
- }
-
- private boolean jj_2_41(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_41(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(40, xla); }
- }
-
- private boolean jj_2_42(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_42(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(41, xla); }
- }
-
- private boolean jj_2_43(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_43(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(42, xla); }
- }
-
- private boolean jj_2_44(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_44(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(43, xla); }
- }
-
- private boolean jj_2_45(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_45(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(44, xla); }
- }
-
- private boolean jj_2_46(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_46(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(45, xla); }
- }
-
- private boolean jj_2_47(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_47(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(46, xla); }
- }
-
- private boolean jj_2_48(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_48(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(47, xla); }
- }
-
- private boolean jj_2_49(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_49(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(48, xla); }
- }
-
- private boolean jj_2_50(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_50(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(49, xla); }
- }
-
- private boolean jj_2_51(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_51(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(50, xla); }
- }
-
- private boolean jj_2_52(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_52(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(51, xla); }
- }
-
- private boolean jj_2_53(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_53(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(52, xla); }
- }
-
- private boolean jj_2_54(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_54(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(53, xla); }
- }
-
- private boolean jj_2_55(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_55(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(54, xla); }
- }
-
- private boolean jj_2_56(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_56(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(55, xla); }
- }
-
- private boolean jj_2_57(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_57(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(56, xla); }
- }
-
- private boolean jj_2_58(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_58(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(57, xla); }
- }
-
- private boolean jj_2_59(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_59(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(58, xla); }
- }
-
- private boolean jj_2_60(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_60(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(59, xla); }
- }
-
- private boolean jj_2_61(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_61(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(60, xla); }
- }
-
- private boolean jj_2_62(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_62(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(61, xla); }
- }
-
- private boolean jj_2_63(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_63(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(62, xla); }
- }
-
- private boolean jj_2_64(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_64(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(63, xla); }
- }
-
- private boolean jj_2_65(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_65(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(64, xla); }
- }
-
- private boolean jj_2_66(int xla) {
- jj_la = xla; jj_lastpos = jj_scanpos = token;
- try { return !jj_3_66(); }
- catch(LookaheadSuccess ls) { return true; }
- finally { jj_save(65, xla); }
- }
-
- private boolean jj_3R_19() {
- if (jj_3R_20()) return true;
+ private boolean jj_3_2() {
Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3_35()) { jj_scanpos = xsp; break; }
- }
+ xsp = jj_scanpos;
+ if (jj_3R_12()) jj_scanpos = xsp;
+ if (jj_scan_token(IDENTIFIER)) return true;
+ if (jj_scan_token(LPAREN)) return true;
return false;
}
- private boolean jj_3_34() {
+ private boolean jj_3R_33() {
if (jj_scan_token(MINUS)) return true;
- if (jj_3R_19()) return true;
return false;
}
- private boolean jj_3_33() {
- if (jj_scan_token(PLUS)) return true;
- if (jj_3R_19()) return true;
+ private boolean jj_3R_68() {
+ if (jj_scan_token(IDENTIFIER)) return true;
return false;
}
- private boolean jj_3_32() {
+ private boolean jj_3R_25() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_33()) {
+ if (jj_3R_32()) {
jj_scanpos = xsp;
- if (jj_3_34()) return true;
+ if (jj_3R_33()) return true;
}
return false;
}
- private boolean jj_3_27() {
- if (jj_scan_token(GE1)) return true;
+ private boolean jj_3R_32() {
+ if (jj_scan_token(PLUS)) return true;
return false;
}
- private boolean jj_3R_18() {
- if (jj_3R_19()) return true;
+ private boolean jj_3R_58() {
+ if (jj_3R_68()) return true;
+ return false;
+ }
+
+ private boolean jj_3R_20() {
+ if (jj_3R_24()) return true;
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3_32()) { jj_scanpos = xsp; break; }
+ if (jj_3R_25()) { jj_scanpos = xsp; break; }
}
return false;
}
- private boolean jj_3_25() {
- if (jj_scan_token(LE1)) return true;
+ private boolean jj_3R_57() {
+ if (jj_3R_67()) return true;
return false;
}
- private boolean jj_3_23() {
- if (jj_scan_token(GT1)) return true;
+ private boolean jj_3R_56() {
+ if (jj_scan_token(LPAREN)) return true;
+ if (jj_3R_66()) return true;
return false;
}
- private boolean jj_3_26() {
- if (jj_scan_token(GE0)) return true;
- return false;
- }
-
- private boolean jj_3_21() {
- if (jj_scan_token(LT1)) return true;
- return false;
- }
-
- private boolean jj_3_31() {
+ private boolean jj_3R_48() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_26()) {
+ if (jj_3R_56()) {
jj_scanpos = xsp;
- if (jj_3_27()) return true;
+ if (jj_3R_57()) {
+ jj_scanpos = xsp;
+ if (jj_3R_58()) return true;
}
- if (jj_3R_18()) return true;
+ }
return false;
}
- private boolean jj_3_24() {
- if (jj_scan_token(LE0)) return true;
- return false;
- }
-
- private boolean jj_3R_34() {
- if (jj_scan_token(NULL)) return true;
- return false;
- }
-
- private boolean jj_3_30() {
+ private boolean jj_3R_29() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_24()) {
+ if (jj_scan_token(29)) {
jj_scanpos = xsp;
- if (jj_3_25()) return true;
+ if (jj_scan_token(30)) return true;
}
- if (jj_3R_18()) return true;
return false;
}
- private boolean jj_3_22() {
- if (jj_scan_token(GT0)) return true;
+ private boolean jj_3R_65() {
+ if (jj_scan_token(NULL)) return true;
return false;
}
- private boolean jj_3_29() {
+ private boolean jj_3R_28() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_22()) {
+ if (jj_scan_token(31)) {
jj_scanpos = xsp;
- if (jj_3_23()) return true;
+ if (jj_scan_token(32)) return true;
}
- if (jj_3R_18()) return true;
return false;
}
- private boolean jj_3_20() {
- if (jj_scan_token(LT0)) return true;
- return false;
- }
-
- private boolean jj_3_28() {
+ private boolean jj_3R_27() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_20()) {
+ if (jj_scan_token(25)) {
jj_scanpos = xsp;
- if (jj_3_21()) return true;
+ if (jj_scan_token(26)) return true;
}
- if (jj_3R_18()) return true;
return false;
}
- private boolean jj_3_19() {
+ private boolean jj_3R_21() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_28()) {
+ if (jj_3R_26()) {
jj_scanpos = xsp;
- if (jj_3_29()) {
+ if (jj_3R_27()) {
jj_scanpos = xsp;
- if (jj_3_30()) {
+ if (jj_3R_28()) {
jj_scanpos = xsp;
- if (jj_3_31()) return true;
+ if (jj_3R_29()) return true;
}
}
}
return false;
}
- private boolean jj_3_16() {
- if (jj_scan_token(NE1)) return true;
+ private boolean jj_3R_26() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(27)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(28)) return true;
+ }
return false;
}
- private boolean jj_3R_33() {
- if (jj_scan_token(STRING_LITERAL)) return true;
+ private boolean jj_3R_60() {
+ if (jj_scan_token(LBRACK)) return true;
return false;
}
- private boolean jj_3R_17() {
- if (jj_3R_18()) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3_19()) { jj_scanpos = xsp; break; }
- }
+ private boolean jj_3R_64() {
+ if (jj_scan_token(STRING_LITERAL)) return true;
return false;
}
- private boolean jj_3_14() {
- if (jj_scan_token(EQ1)) return true;
+ private boolean jj_3R_50() {
+ if (jj_3R_60()) return true;
return false;
}
- private boolean jj_3_11() {
- if (jj_scan_token(AND1)) return true;
+ private boolean jj_3R_18() {
+ if (jj_3R_20()) return true;
+ Token xsp;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_21()) { jj_scanpos = xsp; break; }
+ }
return false;
}
- private boolean jj_3_15() {
- if (jj_scan_token(NE0)) return true;
+ private boolean jj_3R_59() {
+ if (jj_scan_token(DOT)) return true;
return false;
}
- private boolean jj_3_18() {
+ private boolean jj_3R_23() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_15()) {
+ if (jj_scan_token(35)) {
jj_scanpos = xsp;
- if (jj_3_16()) return true;
+ if (jj_scan_token(36)) return true;
}
- if (jj_3R_17()) return true;
return false;
}
- private boolean jj_3_13() {
- if (jj_scan_token(EQ0)) return true;
+ private boolean jj_3R_63() {
+ if (jj_scan_token(INTEGER_LITERAL)) return true;
return false;
}
- private boolean jj_3R_32() {
- if (jj_scan_token(INTEGER_LITERAL)) return true;
+ private boolean jj_3R_22() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(33)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(34)) return true;
+ }
return false;
}
- private boolean jj_3_12() {
+ private boolean jj_3R_19() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_17()) {
+ if (jj_3R_22()) {
jj_scanpos = xsp;
- if (jj_3_18()) return true;
+ if (jj_3R_23()) return true;
}
return false;
}
- private boolean jj_3_17() {
+ private boolean jj_3R_17() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_13()) {
+ if (jj_scan_token(39)) {
jj_scanpos = xsp;
- if (jj_3_14()) return true;
+ if (jj_scan_token(40)) return true;
}
- if (jj_3R_17()) return true;
return false;
}
- private boolean jj_3_10() {
- if (jj_scan_token(AND0)) return true;
+ private boolean jj_3R_49() {
+ if (jj_3R_59()) return true;
return false;
}
- private boolean jj_3_9() {
+ private boolean jj_3R_46() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_10()) {
+ if (jj_3R_49()) {
jj_scanpos = xsp;
- if (jj_3_11()) return true;
+ if (jj_3R_50()) return true;
}
- if (jj_3R_16()) return true;
return false;
}
private boolean jj_3R_16() {
- if (jj_3R_17()) return true;
+ if (jj_3R_18()) return true;
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3_12()) { jj_scanpos = xsp; break; }
+ if (jj_3R_19()) { jj_scanpos = xsp; break; }
}
return false;
}
- private boolean jj_3R_31() {
+ private boolean jj_3R_62() {
if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
return false;
}
- private boolean jj_3_8() {
- if (jj_scan_token(OR1)) return true;
+ private boolean jj_3R_43() {
+ if (jj_3R_46()) return true;
return false;
}
- private boolean jj_3R_15() {
- if (jj_3R_16()) return true;
- Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3_9()) { jj_scanpos = xsp; break; }
- }
+ private boolean jj_3R_45() {
+ if (jj_3R_48()) return true;
return false;
}
- private boolean jj_3_66() {
+ private boolean jj_3R_70() {
if (jj_scan_token(FALSE)) return true;
return false;
}
- private boolean jj_3_7() {
- if (jj_scan_token(OR0)) return true;
+ private boolean jj_3R_44() {
+ if (jj_3R_47()) return true;
return false;
}
- private boolean jj_3_6() {
+ private boolean jj_3R_14() {
+ if (jj_3R_16()) return true;
Token xsp;
- xsp = jj_scanpos;
- if (jj_3_7()) {
- jj_scanpos = xsp;
- if (jj_3_8()) return true;
+ while (true) {
+ xsp = jj_scanpos;
+ if (jj_3R_17()) { jj_scanpos = xsp; break; }
}
- if (jj_3R_15()) return true;
return false;
}
- private boolean jj_3_58() {
- if (jj_scan_token(COMMA)) return true;
- if (jj_3R_27()) return true;
+ private boolean jj_3R_42() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_44()) {
+ jj_scanpos = xsp;
+ if (jj_3R_45()) return true;
+ }
return false;
}
- private boolean jj_3R_30() {
+ private boolean jj_3R_15() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_65()) {
+ if (jj_scan_token(41)) {
jj_scanpos = xsp;
- if (jj_3_66()) return true;
+ if (jj_scan_token(42)) return true;
}
return false;
}
- private boolean jj_3_65() {
+ private boolean jj_3R_69() {
if (jj_scan_token(TRUE)) return true;
return false;
}
- private boolean jj_3R_35() {
- if (jj_3R_15()) return true;
+ private boolean jj_3R_61() {
Token xsp;
- while (true) {
- xsp = jj_scanpos;
- if (jj_3_6()) { jj_scanpos = xsp; break; }
+ xsp = jj_scanpos;
+ if (jj_3R_69()) {
+ jj_scanpos = xsp;
+ if (jj_3R_70()) return true;
}
return false;
}
- private boolean jj_3_64() {
- if (jj_3R_34()) return true;
- return false;
- }
-
- private boolean jj_3_5() {
- if (jj_scan_token(QUESTIONMARK)) return true;
+ private boolean jj_3R_13() {
if (jj_3R_14()) return true;
- if (jj_scan_token(COLON)) return true;
- return false;
- }
-
- private boolean jj_3_63() {
- if (jj_3R_33()) return true;
- return false;
- }
-
- private boolean jj_3_62() {
- if (jj_3R_32()) return true;
- return false;
- }
-
- private boolean jj_3_61() {
- if (jj_3R_31()) return true;
- return false;
- }
-
- private boolean jj_3_59() {
- if (jj_3R_27()) return true;
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3_58()) { jj_scanpos = xsp; break; }
+ if (jj_3R_15()) { jj_scanpos = xsp; break; }
}
return false;
}
- private boolean jj_3R_23() {
+ private boolean jj_3R_41() {
+ if (jj_3R_42()) return true;
Token xsp;
- xsp = jj_scanpos;
- if (jj_3_60()) {
- jj_scanpos = xsp;
- if (jj_3_61()) {
- jj_scanpos = xsp;
- if (jj_3_62()) {
- jj_scanpos = xsp;
- if (jj_3_63()) {
- jj_scanpos = xsp;
- if (jj_3_64()) return true;
- }
- }
- }
- }
- return false;
- }
-
- private boolean jj_3_4() {
- if (jj_3R_13()) return true;
- return false;
- }
-
- private boolean jj_3_60() {
- if (jj_3R_30()) return true;
- return false;
- }
-
- private boolean jj_3R_14() {
- if (jj_3R_35()) return true;
- Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3_5()) { jj_scanpos = xsp; break; }
+ if (jj_3R_43()) { jj_scanpos = xsp; break; }
}
return false;
}
- private boolean jj_3R_27() {
- if (jj_3R_14()) return true;
+ private boolean jj_3R_55() {
+ if (jj_3R_65()) return true;
return false;
}
- private boolean jj_3_57() {
- if (jj_scan_token(IDENTIFIER)) return true;
- if (jj_scan_token(COLON)) return true;
+ private boolean jj_3R_54() {
+ if (jj_3R_64()) return true;
return false;
}
- private boolean jj_3R_38() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3_57()) jj_scanpos = xsp;
- if (jj_scan_token(IDENTIFIER)) return true;
- if (jj_scan_token(LPAREN)) return true;
- xsp = jj_scanpos;
- if (jj_3_59()) jj_scanpos = xsp;
- if (jj_scan_token(RPAREN)) return true;
+ private boolean jj_3R_53() {
+ if (jj_3R_63()) return true;
return false;
}
- private boolean jj_3R_12() {
- if (jj_scan_token(START_DYNAMIC_EXPRESSION)) return true;
- if (jj_3R_27()) return true;
- if (jj_scan_token(END_EXPRESSION)) return true;
- return false;
- }
-
- private boolean jj_3_3() {
- if (jj_3R_12()) return true;
- return false;
- }
-
- private boolean jj_3R_28() {
- if (jj_scan_token(IDENTIFIER)) return true;
+ private boolean jj_3_1() {
+ if (jj_scan_token(QUESTIONMARK)) return true;
+ if (jj_3R_11()) return true;
if (jj_scan_token(COLON)) return true;
return false;
}
- private boolean jj_3R_11() {
- if (jj_scan_token(START_DEFERRED_EXPRESSION)) return true;
- if (jj_3R_27()) return true;
- if (jj_scan_token(END_EXPRESSION)) return true;
+ private boolean jj_3R_52() {
+ if (jj_3R_62()) return true;
return false;
}
- private boolean jj_3_55() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_28()) jj_scanpos = xsp;
- if (jj_scan_token(IDENTIFIER)) return true;
- if (jj_scan_token(LPAREN)) return true;
+ private boolean jj_3R_37() {
+ if (jj_3R_41()) return true;
return false;
}
- private boolean jj_3R_29() {
- if (jj_scan_token(IDENTIFIER)) return true;
+ private boolean jj_3R_51() {
+ if (jj_3R_61()) return true;
return false;
}
- private boolean jj_3R_13() {
- if (jj_scan_token(LITERAL_EXPRESSION)) return true;
- return false;
- }
-
- private boolean jj_3_56() {
- if (jj_3R_29()) return true;
- return false;
- }
-
- private boolean jj_3R_37() {
- if (jj_3R_38()) return true;
- return false;
- }
-
- private boolean jj_3R_24() {
+ private boolean jj_3R_47() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_54()) {
+ if (jj_3R_51()) {
jj_scanpos = xsp;
- if (jj_3R_37()) {
+ if (jj_3R_52()) {
jj_scanpos = xsp;
- if (jj_3_56()) return true;
- }
- }
- return false;
- }
-
- private boolean jj_3_54() {
- if (jj_scan_token(LPAREN)) return true;
- if (jj_3R_27()) return true;
- if (jj_scan_token(RPAREN)) return true;
- return false;
- }
-
- private boolean jj_3_2() {
- if (jj_3R_11()) return true;
- return false;
- }
-
- private boolean jj_3_1() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3_2()) {
+ if (jj_3R_53()) {
jj_scanpos = xsp;
- if (jj_3_3()) {
+ if (jj_3R_54()) {
jj_scanpos = xsp;
- if (jj_3_4()) return true;
+ if (jj_3R_55()) return true;
}
}
- return false;
- }
-
- private boolean jj_3R_26() {
- if (jj_scan_token(LBRACK)) return true;
- if (jj_3R_27()) return true;
- if (jj_scan_token(RBRACK)) return true;
- return false;
- }
-
- private boolean jj_3_53() {
- if (jj_3R_26()) return true;
- return false;
- }
-
- private boolean jj_3R_25() {
- if (jj_scan_token(DOT)) return true;
- if (jj_scan_token(IDENTIFIER)) return true;
- return false;
- }
-
- private boolean jj_3R_22() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3_52()) {
- jj_scanpos = xsp;
- if (jj_3_53()) return true;
}
+ }
return false;
}
- private boolean jj_3_52() {
- if (jj_3R_25()) return true;
- return false;
- }
-
- private boolean jj_3_49() {
- if (jj_3R_22()) return true;
- return false;
- }
-
- private boolean jj_3_51() {
- if (jj_3R_24()) return true;
- return false;
- }
-
private boolean jj_3R_36() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3_50()) {
- jj_scanpos = xsp;
- if (jj_3_51()) return true;
- }
+ if (jj_scan_token(EMPTY)) return true;
+ if (jj_3R_30()) return true;
return false;
}
- private boolean jj_3_50() {
- if (jj_3R_23()) return true;
- return false;
- }
-
- private boolean jj_3R_21() {
- if (jj_3R_36()) return true;
+ private boolean jj_3R_11() {
+ if (jj_3R_13()) return true;
Token xsp;
while (true) {
xsp = jj_scanpos;
- if (jj_3_49()) { jj_scanpos = xsp; break; }
+ if (jj_3_1()) { jj_scanpos = xsp; break; }
}
return false;
}
- private boolean jj_3_44() {
- if (jj_scan_token(NOT1)) return true;
- return false;
- }
-
- private boolean jj_3_48() {
- if (jj_3R_21()) return true;
- return false;
- }
-
- private boolean jj_3_47() {
- if (jj_scan_token(EMPTY)) return true;
- if (jj_3R_20()) return true;
- return false;
- }
-
- private boolean jj_3_43() {
- if (jj_scan_token(NOT0)) return true;
- return false;
- }
-
- private boolean jj_3_46() {
+ private boolean jj_3R_35() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_43()) {
+ if (jj_scan_token(37)) {
jj_scanpos = xsp;
- if (jj_3_44()) return true;
+ if (jj_scan_token(38)) return true;
}
- if (jj_3R_20()) return true;
+ if (jj_3R_30()) return true;
return false;
}
- private boolean jj_3R_20() {
+ private boolean jj_3R_30() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_45()) {
+ if (jj_3R_34()) {
jj_scanpos = xsp;
- if (jj_3_46()) {
+ if (jj_3R_35()) {
jj_scanpos = xsp;
- if (jj_3_47()) {
+ if (jj_3R_36()) {
jj_scanpos = xsp;
- if (jj_3_48()) return true;
+ if (jj_3R_37()) return true;
}
}
}
return false;
}
- private boolean jj_3_45() {
+ private boolean jj_3R_34() {
if (jj_scan_token(MINUS)) return true;
- if (jj_3R_20()) return true;
+ if (jj_3R_30()) return true;
return false;
}
- private boolean jj_3_39() {
- if (jj_scan_token(MOD1)) return true;
+ private boolean jj_3R_66() {
+ if (jj_3R_11()) return true;
return false;
}
- private boolean jj_3_37() {
- if (jj_scan_token(DIV1)) return true;
+ private boolean jj_3R_40() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_scan_token(51)) {
+ jj_scanpos = xsp;
+ if (jj_scan_token(52)) return true;
+ }
return false;
}
- private boolean jj_3_38() {
- if (jj_scan_token(MOD0)) return true;
- return false;
- }
-
- private boolean jj_3_36() {
- if (jj_scan_token(DIV0)) return true;
- return false;
- }
-
- private boolean jj_3_42() {
+ private boolean jj_3R_39() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_38()) {
+ if (jj_scan_token(49)) {
jj_scanpos = xsp;
- if (jj_3_39()) return true;
+ if (jj_scan_token(50)) return true;
}
- if (jj_3R_20()) return true;
return false;
}
- private boolean jj_3_41() {
+ private boolean jj_3_3() {
+ if (jj_scan_token(IDENTIFIER)) return true;
+ if (jj_scan_token(COLON)) return true;
+ return false;
+ }
+
+ private boolean jj_3R_67() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_36()) {
- jj_scanpos = xsp;
- if (jj_3_37()) return true;
- }
- if (jj_3R_20()) return true;
+ if (jj_3_3()) jj_scanpos = xsp;
+ if (jj_scan_token(IDENTIFIER)) return true;
+ if (jj_scan_token(LPAREN)) return true;
return false;
}
- private boolean jj_3_35() {
+ private boolean jj_3R_31() {
Token xsp;
xsp = jj_scanpos;
- if (jj_3_40()) {
+ if (jj_3R_38()) {
jj_scanpos = xsp;
- if (jj_3_41()) {
+ if (jj_3R_39()) {
jj_scanpos = xsp;
- if (jj_3_42()) return true;
+ if (jj_3R_40()) return true;
}
}
return false;
}
- private boolean jj_3_40() {
+ private boolean jj_3R_38() {
if (jj_scan_token(MULT)) return true;
- if (jj_3R_20()) return true;
return false;
}
@@ -2371,7 +1908,7 @@
private Token jj_scanpos, jj_lastpos;
private int jj_la;
private int jj_gen;
- final private int[] jj_la1 = new int[0];
+ final private int[] jj_la1 = new int[33];
static private int[] jj_la1_0;
static private int[] jj_la1_1;
static {
@@ -2379,12 +1916,12 @@
jj_la1_init_1();
}
private static void jj_la1_init_0() {
- jj_la1_0 = new int[] {};
+ jj_la1_0 = new int[] {0xe,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfe000000,0x18000000,0x6000000,0x80000000,0x60000000,0xfe000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x9d600,0x240000,0x9d600,0x240000,0x80000,0x0,0x1000000,0x9d600,0x1d600,0xc000,};
}
private static void jj_la1_init_1() {
- jj_la1_1 = new int[] {};
+ jj_la1_1 = new int[] {0x0,0x0,0x600,0x600,0x180,0x180,0x1e,0x6,0x18,0x1e,0x1,0x0,0x0,0x1,0x0,0x1,0xc000,0xc000,0x1e2000,0x60000,0x180000,0x1e2000,0x60,0x208860,0x0,0x200000,0x0,0x0,0x200000,0x0,0x208860,0x0,0x0,};
}
- final private JJCalls[] jj_2_rtns = new JJCalls[66];
+ final private JJCalls[] jj_2_rtns = new JJCalls[3];
private boolean jj_rescan = false;
private int jj_gc = 0;
@@ -2399,7 +1936,7 @@
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 33; i++) jj_la1[i] = -1;
for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
}
@@ -2415,7 +1952,7 @@
jj_ntk = -1;
jjtree.reset();
jj_gen = 0;
- for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 33; i++) jj_la1[i] = -1;
for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
}
@@ -2426,7 +1963,7 @@
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 33; i++) jj_la1[i] = -1;
for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
}
@@ -2438,7 +1975,7 @@
jj_ntk = -1;
jjtree.reset();
jj_gen = 0;
- for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 33; i++) jj_la1[i] = -1;
for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
}
@@ -2448,7 +1985,7 @@
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 33; i++) jj_la1[i] = -1;
for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
}
@@ -2459,7 +1996,7 @@
jj_ntk = -1;
jjtree.reset();
jj_gen = 0;
- for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 33; i++) jj_la1[i] = -1;
for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
}
@@ -2576,7 +2113,7 @@
la1tokens[jj_kind] = true;
jj_kind = -1;
}
- for (int i = 0; i < 0; i++) {
+ for (int i = 0; i < 33; i++) {
if (jj_la1[i] == jj_gen) {
for (int j = 0; j < 32; j++) {
if ((jj_la1_0[i] & (1<<j)) != 0) {
@@ -2615,7 +2152,7 @@
private void jj_rescan_token() {
jj_rescan = true;
- for (int i = 0; i < 66; i++) {
+ for (int i = 0; i < 3; i++) {
try {
JJCalls p = jj_2_rtns[i];
do {
@@ -2625,69 +2162,6 @@
case 0: jj_3_1(); break;
case 1: jj_3_2(); break;
case 2: jj_3_3(); break;
- case 3: jj_3_4(); break;
- case 4: jj_3_5(); break;
- case 5: jj_3_6(); break;
- case 6: jj_3_7(); break;
- case 7: jj_3_8(); break;
- case 8: jj_3_9(); break;
- case 9: jj_3_10(); break;
- case 10: jj_3_11(); break;
- case 11: jj_3_12(); break;
- case 12: jj_3_13(); break;
- case 13: jj_3_14(); break;
- case 14: jj_3_15(); break;
- case 15: jj_3_16(); break;
- case 16: jj_3_17(); break;
- case 17: jj_3_18(); break;
- case 18: jj_3_19(); break;
- case 19: jj_3_20(); break;
- case 20: jj_3_21(); break;
- case 21: jj_3_22(); break;
- case 22: jj_3_23(); break;
- case 23: jj_3_24(); break;
- case 24: jj_3_25(); break;
- case 25: jj_3_26(); break;
- case 26: jj_3_27(); break;
- case 27: jj_3_28(); break;
- case 28: jj_3_29(); break;
- case 29: jj_3_30(); break;
- case 30: jj_3_31(); break;
- case 31: jj_3_32(); break;
- case 32: jj_3_33(); break;
- case 33: jj_3_34(); break;
- case 34: jj_3_35(); break;
- case 35: jj_3_36(); break;
- case 36: jj_3_37(); break;
- case 37: jj_3_38(); break;
- case 38: jj_3_39(); break;
- case 39: jj_3_40(); break;
- case 40: jj_3_41(); break;
- case 41: jj_3_42(); break;
- case 42: jj_3_43(); break;
- case 43: jj_3_44(); break;
- case 44: jj_3_45(); break;
- case 45: jj_3_46(); break;
- case 46: jj_3_47(); break;
- case 47: jj_3_48(); break;
- case 48: jj_3_49(); break;
- case 49: jj_3_50(); break;
- case 50: jj_3_51(); break;
- case 51: jj_3_52(); break;
- case 52: jj_3_53(); break;
- case 53: jj_3_54(); break;
- case 54: jj_3_55(); break;
- case 55: jj_3_56(); break;
- case 56: jj_3_57(); break;
- case 57: jj_3_58(); break;
- case 58: jj_3_59(); break;
- case 59: jj_3_60(); break;
- case 60: jj_3_61(); break;
- case 61: jj_3_62(); break;
- case 62: jj_3_63(); break;
- case 63: jj_3_64(); break;
- case 64: jj_3_65(); break;
- case 65: jj_3_66(); break;
}
}
p = p.next;
Modified: trunk/java/org/apache/el/parser/ELParserConstants.java
===================================================================
--- trunk/java/org/apache/el/parser/ELParserConstants.java 2008-09-19 02:11:27 UTC (rev 785)
+++ trunk/java/org/apache/el/parser/ELParserConstants.java 2008-09-19 02:13:40 UTC (rev 786)
@@ -1,19 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
/* Generated By:JJTree&JavaCC: Do not edit this line. ELParserConstants.java */
package org.apache.el.parser;
Modified: trunk/java/org/apache/el/parser/ELParserTokenManager.java
===================================================================
--- trunk/java/org/apache/el/parser/ELParserTokenManager.java 2008-09-19 02:11:27 UTC (rev 785)
+++ trunk/java/org/apache/el/parser/ELParserTokenManager.java 2008-09-19 02:13:40 UTC (rev 786)
@@ -1,19 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
/* Generated By:JJTree&JavaCC: Do not edit this line. ELParserTokenManager.java */
package org.apache.el.parser;
import java.io.StringReader;
Modified: trunk/java/org/apache/el/parser/ELParserTreeConstants.java
===================================================================
--- trunk/java/org/apache/el/parser/ELParserTreeConstants.java 2008-09-19 02:11:27 UTC (rev 785)
+++ trunk/java/org/apache/el/parser/ELParserTreeConstants.java 2008-09-19 02:13:40 UTC (rev 786)
@@ -1,19 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
/* Generated By:JavaCC: Do not edit this line. ELParserTreeConstants.java Version 4.1 */
package org.apache.el.parser;
Modified: trunk/java/org/apache/el/parser/JJTELParserState.java
===================================================================
--- trunk/java/org/apache/el/parser/JJTELParserState.java 2008-09-19 02:11:27 UTC (rev 785)
+++ trunk/java/org/apache/el/parser/JJTELParserState.java 2008-09-19 02:13:40 UTC (rev 786)
@@ -1,19 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
/* Generated By:JavaCC: Do not edit this line. JJTELParserState.java Version 4.1 */
package org.apache.el.parser;
Modified: trunk/java/org/apache/el/parser/ParseException.java
===================================================================
--- trunk/java/org/apache/el/parser/ParseException.java 2008-09-19 02:11:27 UTC (rev 785)
+++ trunk/java/org/apache/el/parser/ParseException.java 2008-09-19 02:13:40 UTC (rev 786)
@@ -1,19 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 4.1 */
/* JavaCCOptions:KEEP_LINE_COL=null */
package org.apache.el.parser;
Modified: trunk/java/org/apache/el/parser/SimpleCharStream.java
===================================================================
--- trunk/java/org/apache/el/parser/SimpleCharStream.java 2008-09-19 02:11:27 UTC (rev 785)
+++ trunk/java/org/apache/el/parser/SimpleCharStream.java 2008-09-19 02:13:40 UTC (rev 786)
@@ -1,19 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.1 */
/* JavaCCOptions:STATIC=false */
package org.apache.el.parser;
Modified: trunk/java/org/apache/el/parser/Token.java
===================================================================
--- trunk/java/org/apache/el/parser/Token.java 2008-09-19 02:11:27 UTC (rev 785)
+++ trunk/java/org/apache/el/parser/Token.java 2008-09-19 02:13:40 UTC (rev 786)
@@ -1,19 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
/* Generated By:JavaCC: Do not edit this line. Token.java Version 4.1 */
/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null */
package org.apache.el.parser;
Modified: trunk/java/org/apache/el/parser/TokenMgrError.java
===================================================================
--- trunk/java/org/apache/el/parser/TokenMgrError.java 2008-09-19 02:11:27 UTC (rev 785)
+++ trunk/java/org/apache/el/parser/TokenMgrError.java 2008-09-19 02:13:40 UTC (rev 786)
@@ -1,19 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 4.1 */
/* JavaCCOptions: */
package org.apache.el.parser;
16 years, 5 months
JBossWeb SVN: r785 - trunk/java/org/apache/el/parser.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2008-09-18 22:11:27 -0400 (Thu, 18 Sep 2008)
New Revision: 785
Modified:
trunk/java/org/apache/el/parser/ELParser.jjt
Log:
- More optimized lookahead usage.
Modified: trunk/java/org/apache/el/parser/ELParser.jjt
===================================================================
--- trunk/java/org/apache/el/parser/ELParser.jjt 2008-09-19 01:53:57 UTC (rev 784)
+++ trunk/java/org/apache/el/parser/ELParser.jjt 2008-09-19 02:11:27 UTC (rev 785)
@@ -5,9 +5,9 @@
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -16,8 +16,8 @@
*/
/*
- Author: Jacob Hookom
- Email: jacob at hookom.net
+ Author: Jacob Hookom
+ Email: jacob at hookom.net
*/
/* == Option Declaration == */
@@ -32,7 +32,6 @@
JAVA_UNICODE_ESCAPE=false;
UNICODE_INPUT=true;
BUILD_NODE_FILES=true;
- LOOKAHEAD=3;
}
/* == Parser Declaration == */
@@ -78,7 +77,7 @@
*/
void DeferredExpression() #DeferredExpression : {}
{
- <START_DEFERRED_EXPRESSION> Expression() <END_EXPRESSION>
+ <START_DEFERRED_EXPRESSION> Expression() <END_EXPRESSION>
}
/*
@@ -87,7 +86,7 @@
*/
void DynamicExpression() #DynamicExpression : {}
{
- <START_DYNAMIC_EXPRESSION> Expression() <END_EXPRESSION>
+ <START_DYNAMIC_EXPRESSION> Expression() <END_EXPRESSION>
}
/*
@@ -105,7 +104,7 @@
*/
void Choice() : {}
{
- Or() (<QUESTIONMARK> Choice() <COLON> Choice() #Choice(3))*
+ Or() (LOOKAHEAD(3) <QUESTIONMARK> Choice() <COLON> Choice() #Choice(3))*
}
/*
@@ -184,8 +183,8 @@
|
((<DIV0>|<DIV1>) Unary() #Div(2))
|
- ((<MOD0>|<MOD1>) Unary() #Mod(2))
- )*
+ ((<MOD0>|<MOD1>) Unary() #Mod(2))
+ )*
}
/*
@@ -194,12 +193,12 @@
*/
void Unary() : {}
{
- <MINUS> Unary() #Negative
+ <MINUS> Unary() #Negative
|
- (<NOT0>|<NOT1>) Unary() #Not
+ (<NOT0>|<NOT1>) Unary() #Not
|
<EMPTY> Unary() #Empty
- |
+ |
Value()
}
@@ -279,7 +278,7 @@
Token t1 = null;
}
{
- (t0=<IDENTIFIER> <COLON>)? t1=<IDENTIFIER>
+ (LOOKAHEAD(2) t0=<IDENTIFIER> <COLON>)? t1=<IDENTIFIER>
{
if (t0 != null) {
jjtThis.setPrefix(t0.image);
@@ -376,62 +375,62 @@
<IN_EXPRESSION> TOKEN :
{
< INTEGER_LITERAL: ["0"-"9"] (["0"-"9"])* >
-| < FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)?
+| < FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)?
| "." (["0"-"9"])+ (<EXPONENT>)?
| (["0"-"9"])+ <EXPONENT>
>
-| < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
-| < STRING_LITERAL: ("\"" ((~["\"","\\"])
+| < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
+| < STRING_LITERAL: ("\"" ((~["\"","\\"])
| ("\\" ( ["\\","\""] )))* "\"")
| ("\'" ((~["\'","\\"])
| ("\\" ( ["\\","\'"] )))* "\'")
>
-| < BADLY_ESCAPED_STRING_LITERAL: ("\"" (~["\"","\\"])* ("\\" ( ~["\\","\""] )))
+| < BADLY_ESCAPED_STRING_LITERAL: ("\"" (~["\"","\\"])* ("\\" ( ~["\\","\""] )))
| ("\'" (~["\'","\\"])* ("\\" ( ~["\\","\'"] )))
>
-| < TRUE : "true" >
-| < FALSE : "false" >
-| < NULL : "null" >
-| < END_EXPRESSION : "}" > : DEFAULT
-| < DOT : "." >
-| < LPAREN : "(" >
-| < RPAREN : ")" >
-| < LBRACK : "[" >
-| < RBRACK : "]" >
-| < COLON : ":" >
-| < COMMA : "," >
-| < GT0 : ">" >
-| < GT1 : "gt" >
-| < LT0 : "<" >
-| < LT1 : "lt" >
-| < GE0 : ">=" >
-| < GE1 : "ge" >
-| < LE0 : "<=" >
-| < LE1 : "le" >
-| < EQ0 : "==" >
-| < EQ1 : "eq" >
-| < NE0 : "!=" >
-| < NE1 : "ne" >
-| < NOT0 : "!" >
-| < NOT1 : "not" >
-| < AND0 : "&&" >
-| < AND1 : "and" >
-| < OR0 : "||" >
-| < OR1 : "or" >
-| < EMPTY : "empty" >
-| < INSTANCEOF : "instanceof" >
-| < MULT : "*" >
-| < PLUS : "+" >
-| < MINUS : "-" >
-| < QUESTIONMARK : "?" >
-| < DIV0 : "/" >
-| < DIV1 : "div" >
-| < MOD0 : "%" >
-| < MOD1 : "mod" >
-| < IDENTIFIER : (<LETTER>|<IMPL_OBJ_START>) (<LETTER>|<DIGIT>)* >
-| < FUNCTIONSUFFIX : (<IDENTIFIER>) >
-| < #IMPL_OBJ_START: "#" >
-| < #LETTER:
+| < TRUE : "true" >
+| < FALSE : "false" >
+| < NULL : "null" >
+| < END_EXPRESSION : "}" > : DEFAULT
+| < DOT : "." >
+| < LPAREN : "(" >
+| < RPAREN : ")" >
+| < LBRACK : "[" >
+| < RBRACK : "]" >
+| < COLON : ":" >
+| < COMMA : "," >
+| < GT0 : ">" >
+| < GT1 : "gt" >
+| < LT0 : "<" >
+| < LT1 : "lt" >
+| < GE0 : ">=" >
+| < GE1 : "ge" >
+| < LE0 : "<=" >
+| < LE1 : "le" >
+| < EQ0 : "==" >
+| < EQ1 : "eq" >
+| < NE0 : "!=" >
+| < NE1 : "ne" >
+| < NOT0 : "!" >
+| < NOT1 : "not" >
+| < AND0 : "&&" >
+| < AND1 : "and" >
+| < OR0 : "||" >
+| < OR1 : "or" >
+| < EMPTY : "empty" >
+| < INSTANCEOF : "instanceof" >
+| < MULT : "*" >
+| < PLUS : "+" >
+| < MINUS : "-" >
+| < QUESTIONMARK : "?" >
+| < DIV0 : "/" >
+| < DIV1 : "div" >
+| < MOD0 : "%" >
+| < MOD1 : "mod" >
+| < IDENTIFIER : (<LETTER>|<IMPL_OBJ_START>) (<LETTER>|<DIGIT>)* >
+| < FUNCTIONSUFFIX : (<IDENTIFIER>) >
+| < #IMPL_OBJ_START: "#" >
+| < #LETTER:
[
"\u0024",
"\u0041"-"\u005a",
@@ -448,7 +447,7 @@
"\uf900"-"\ufaff"
]
>
-| < #DIGIT:
+| < #DIGIT:
[
"\u0030"-"\u0039",
"\u0660"-"\u0669",
@@ -467,5 +466,5 @@
"\u1040"-"\u1049"
]
>
-| < ILLEGAL_CHARACTER: (~[]) >
+| < ILLEGAL_CHARACTER: (~[]) >
}
16 years, 5 months
JBossWeb SVN: r784 - in trunk: conf and 9 other directories.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2008-09-18 21:53:57 -0400 (Thu, 18 Sep 2008)
New Revision: 784
Added:
trunk/java/org/apache/cometd/
trunk/java/org/apache/cometd/bayeux/
trunk/java/org/apache/cometd/bayeux/Bayeux.java
trunk/java/org/apache/cometd/bayeux/Channel.java
trunk/java/org/apache/cometd/bayeux/Client.java
trunk/java/org/apache/cometd/bayeux/DataFilter.java
trunk/java/org/apache/cometd/bayeux/Listener.java
trunk/java/org/apache/cometd/bayeux/Message.java
trunk/java/org/apache/cometd/bayeux/SecurityPolicy.java
trunk/java/org/apache/tomcat/bayeux/
trunk/java/org/apache/tomcat/bayeux/BayeuxException.java
trunk/java/org/apache/tomcat/bayeux/BayeuxRequest.java
trunk/java/org/apache/tomcat/bayeux/BayeuxServlet.java
trunk/java/org/apache/tomcat/bayeux/ChannelImpl.java
trunk/java/org/apache/tomcat/bayeux/ClientImpl.java
trunk/java/org/apache/tomcat/bayeux/HttpError.java
trunk/java/org/apache/tomcat/bayeux/MessageImpl.java
trunk/java/org/apache/tomcat/bayeux/RequestBase.java
trunk/java/org/apache/tomcat/bayeux/RequestFactory.java
trunk/java/org/apache/tomcat/bayeux/TomcatBayeux.java
trunk/java/org/apache/tomcat/bayeux/UUIDGenerator.java
trunk/java/org/apache/tomcat/bayeux/request/
trunk/java/org/apache/tomcat/bayeux/request/MetaConnectRequest.java
trunk/java/org/apache/tomcat/bayeux/request/MetaDisconnectRequest.java
trunk/java/org/apache/tomcat/bayeux/request/MetaHandshakeRequest.java
trunk/java/org/apache/tomcat/bayeux/request/MetaSubscribeRequest.java
trunk/java/org/apache/tomcat/bayeux/request/MetaUnsubscribeRequest.java
trunk/java/org/apache/tomcat/bayeux/request/PublishRequest.java
trunk/java/org/apache/tomcat/util/json/
trunk/java/org/apache/tomcat/util/json/JSONArray.java
trunk/java/org/apache/tomcat/util/json/JSONException.java
trunk/java/org/apache/tomcat/util/json/JSONObject.java
trunk/java/org/apache/tomcat/util/json/JSONString.java
trunk/java/org/apache/tomcat/util/json/JSONStringer.java
trunk/java/org/apache/tomcat/util/json/JSONTokener.java
trunk/java/org/apache/tomcat/util/json/JSONWriter.java
Modified:
trunk/NOTICE
trunk/build.xml
trunk/conf/web.xml
trunk/webapps/docs/changelog.xml
Log:
- Add the bayeux code, totally untested right now.
- Will add the example app later.
Modified: trunk/NOTICE
===================================================================
--- trunk/NOTICE 2008-09-18 15:57:52 UTC (rev 783)
+++ trunk/NOTICE 2008-09-19 01:53:57 UTC (rev 784)
@@ -7,13 +7,24 @@
This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).
-The Windows Installer is built with the Nullsoft
-Scriptable Install Sysem (NSIS), which is
-open source software. The original software and
+The Windows Installer is built with the
+Nullsoft Scriptable Install Sysem (NSIS), which is
+open source software. The original software and
related information is available at
http://nsis.sourceforge.net.
Java compilation software for JSP pages is provided by Eclipse,
-which is open source software. The orginal software and
+which is open source software. The orginal software and
related infomation is available at
http://www.eclipse.org.
+
+org.apache.tomcat.util.json
+Copyright (c) 2002 JSON.org
+
+org.apache.cometd.bayeux is derivative work originating at the Dojo Foundation
+
+org.apache.tomcat.bayeux
+Copyright 2007-2008 Guy Molinari
+Copyright 2007-2008 Filip Hanik
+Copyright 2007 Dojo Foundation
+Copyright 2007 Mort Bay Consulting Pty. Ltd.
Modified: trunk/build.xml
===================================================================
--- trunk/build.xml 2008-09-18 15:57:52 UTC (rev 783)
+++ trunk/build.xml 2008-09-19 01:53:57 UTC (rev 784)
@@ -50,6 +50,7 @@
<property name="catalina-ant.jar" value="${tomcat.build}/lib/catalina-ant.jar"/>
<property name="catalina-optional.jar" value="${tomcat.build}/lib/catalina-optional.jar"/>
<property name="tomcat-coyote.jar" value="${tomcat.build}/lib/tomcat-coyote.jar"/>
+ <property name="tomcat-bayeux.jar" value="${tomcat.build}/lib/tomcat-bayeux.jar"/>
<property name="jasper.jar" value="${tomcat.build}/lib/jasper.jar"/>
<property name="jasper-el.jar" value="${tomcat.build}/lib/jasper-el.jar"/>
@@ -249,6 +250,17 @@
</fileset>
</jar>
+ <!-- Bayeux -->
+ <jar jarfile="${tomcat-bayeux.jar}">
+ <fileset dir="${tomcat.classes}">
+ <include name="org/apache/cometd/**" />
+ <include name="org/apache/tomcat/bayeux/**" />
+ <!-- Javadoc and i18n exclusions -->
+ <exclude name="**/package.html" />
+ <exclude name="**/LocalStrings_*" />
+ </fileset>
+ </jar>
+
<!-- Jasper Implementation JAR File -->
<jar jarfile="${jasper.jar}">
<fileset dir="${tomcat.classes}">
@@ -574,9 +586,11 @@
<include name="org/apache/naming/**" />
<include name="org/apache/comet/**" />
<include name="org/apache/coyote/**" />
+ <include name="org/apache/tomcat/bayeux/**" />
<include name="org/apache/tomcat/jni/**" />
<include name="org/apache/tomcat/util/**" />
<include name="org/apache/jasper/**" />
+ <include name="org/apache/cometd/bayeux/**" />
<include name="org/apache/el/**" />
<include name="org/jboss/servlet/**" />
<include name="org/jboss/web/**" />
@@ -695,6 +709,13 @@
<param name="destfile" value="${tomcat-dbcp.jar}" />
</antcall>
+ <!-- Download json libraries
+ <antcall target="downloadfile">
+ <param name="sourcefile" value="${json-lib.loc}"/>
+ <param name="destfile" value="${json-lib.jar}"/>
+ <param name="destdir" value="${json-lib.home}"/>
+ </antcall> -->
+
<!-- Build Jasper JDT bundle -->
<antcall target="downloadzip">
<param name="sourcefile" value="${jdt.loc}"/>
Modified: trunk/conf/web.xml
===================================================================
--- trunk/conf/web.xml 2008-09-18 15:57:52 UTC (rev 783)
+++ trunk/conf/web.xml 2008-09-19 01:53:57 UTC (rev 784)
@@ -49,6 +49,9 @@
<!-- readmeFile File name to display with the directory -->
<!-- contents. [null] -->
<!-- -->
+ <!-- useAcceptRanges Should the Accept-Ranges header be included -->
+ <!-- in responses where appropriate? [true] -->
+ <!-- -->
<!-- sendfileSize If the connector used supports sendfile, this -->
<!-- represents the minimal file size in KB for -->
<!-- which sendfile will be used. Use a negative -->
Added: trunk/java/org/apache/cometd/bayeux/Bayeux.java
===================================================================
--- trunk/java/org/apache/cometd/bayeux/Bayeux.java (rev 0)
+++ trunk/java/org/apache/cometd/bayeux/Bayeux.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,242 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cometd.bayeux;
+
+import java.util.List;
+
+/** Bayeux Interface.<br/>
+ * This interface represents the server side API for the Bayeux messaging protocol.
+ * Bayeux is a simple subscribe/publish/receive methodology, not far from JMS, but much simplified.<br/>
+ * It is used both by the actual implementation and by server side clients.<br/>
+ * Server side clients use this to create, retrieve and subscribe to channels.
+ * Server side clients are represented, just like remote clients, through the Client interface.
+ * <br/>
+ * The Bayeux implementations is intended to be thread safe and multiple threads may simultaneously call Bayeux methods.
+ * <br/>
+ * The Bayeux object, is the starting point for any cometd application relying on the Bayeux object.
+ * Dependent on the container, the Bayeux object will be stored in the <code>javax.servlet.ServletContext</code> object
+ * as an attribute under the name <code>Bayeux.DOJOX_COMETD_BAYEUX</code><br/>
+ * To retrieve this object, one would simply call<br/>
+ * <code>Bayeux bx = (Bayeux)getServletContext().getAttribute(Bayeux.DOJOX_COMETD_BAYEUX);
+ * <br/><br/>
+ * The Bayeux protocol is pretty straight forward and includes a bunch of messaging that is not needed to be known to clients,
+ * both server side and remote clients.
+ * This object gets initialized by a container dependent servlet, and the servlet then handles all Bayeux communication from the client.
+ * Remote messsages are delivered to channels, and to server side clients using the <code>Listener</code> interface.<br/>
+ * <br/>
+ * A <code>Bayeux session</code> is active as long as the webapp hosting the Bayeux object is active.<br/>
+ * When the webapplication shuts down, the Bayeux object will unsubscribe all clients and remove all the active channels.
+ *
+ * @author Greg Wilkins
+ * @author Filip Hanik
+ */
+public interface Bayeux {
+
+ /**Meta definitions for channels*/
+ public static final String META="/meta";
+ /**Meta definitions for channels*/
+ public static final String META_SLASH="/meta/";
+ /**Meta definitions for channels - connect message*/
+ public static final String META_CONNECT="/meta/connect";
+ /**Meta definitions for channels - client messsage*/
+ public static final String META_CLIENT="/meta/client";
+ /**Meta definitions for channels - disconnect messsage*/
+ public static final String META_DISCONNECT="/meta/disconnect";
+ /**Meta definitions for channels - handshake messsage*/
+ public static final String META_HANDSHAKE="/meta/handshake";
+ /**Meta definitions for channels - ping messsage*/
+ public static final String META_PING="/meta/ping";
+ /**Meta definitions for channels - reconnect messsage
+ * @deprecated
+ */
+ public static final String META_RECONNECT="/meta/reconnect";
+ /**Meta definitions for channels - status messsage*/
+ public static final String META_STATUS="/meta/status";
+ /**Meta definitions for channels - subscribe messsage*/
+ public static final String META_SUBSCRIBE="/meta/subscribe";
+ /**Meta definitions for channels - unsubscribe messsage*/
+ public static final String META_UNSUBSCRIBE="/meta/unsubscribe";
+ /*Field names inside Bayeux messages*/
+ /**Field names inside Bayeux messages - clientId field*/
+ public static final String CLIENT_FIELD="clientId";
+ /**Field names inside Bayeux messages - data field*/
+ public static final String DATA_FIELD="data";
+ /**Field names inside Bayeux messages - channel field*/
+ public static final String CHANNEL_FIELD="channel";
+ /**Field names inside Bayeux messages - id field*/
+ public static final String ID_FIELD="id";
+ /**Field names inside Bayeux messages - error field*/
+ public static final String ERROR_FIELD="error";
+ /**Field names inside Bayeux messages - timestamp field*/
+ public static final String TIMESTAMP_FIELD="timestamp";
+ /**Field names inside Bayeux messages - transport field*/
+ public static final String TRANSPORT_FIELD="transport";
+ /**Field names inside Bayeux messages - advice field*/
+ public static final String ADVICE_FIELD="advice";
+ /**Field names inside Bayeux messages - successful field*/
+ public static final String SUCCESSFUL_FIELD="successful";
+ /**Field names inside Bayeux messages - subscription field*/
+ public static final String SUBSCRIPTION_FIELD="subscription";
+ /**Field names inside Bayeux messages - ext field*/
+ public static final String EXT_FIELD="ext";
+ /**Field names inside Bayeux messages - connectionType field*/
+ public static final String CONNECTION_TYPE_FIELD="connectionType";
+ /**Field names inside Bayeux messages - version field*/
+ public static final String VERSION_FIELD="version";
+ /**Field names inside Bayeux messages - minimumVersion field*/
+ public static final String MIN_VERSION_FIELD="minimumVersion";
+ /**Field names inside Bayeux messages - supportedConnectionTypes field*/
+ public static final String SUPP_CONNECTION_TYPE_FIELD="supportedConnectionTypes";
+ /**Field names inside Bayeux messages - json-comment-filtered field*/
+ public static final String JSON_COMMENT_FILTERED_FIELD="json-comment-filtered";
+ /**Field names inside Bayeux messages - reconnect field*/
+ public static final String RECONNECT_FIELD = "reconnect";
+ /**Field names inside Bayeux messages - interval field*/
+ public static final String INTERVAL_FIELD = "interval";
+ /**Field values inside Bayeux messages - retry response*/
+ public static final String RETRY_RESPONSE = "retry";
+ /**Field values inside Bayeux messages - handshake response*/
+ public static final String HANDSHAKE_RESPONSE = "handshake";
+ /**Field values inside Bayeux messages - none response*/
+ public static final String NONE_RESPONSE = "none";
+ /**Service channel names-starts with*/
+ public static final String SERVICE="/service";
+ /**Service channel names-trailing slash*/
+ public static final String SERVICE_SLASH="/service/";
+ /*Transport types*/
+ /**Transport types - long polling*/
+ public static final String TRANSPORT_LONG_POLL="long-polling";
+ /**Transport types - callback polling*/
+ public static final String TRANSPORT_CALLBACK_POLL="callback-polling";
+ /**Transport types - iframe*/
+ public static final String TRANSPORT_IFRAME="iframe";
+ /**Transport types - flash*/
+ public static final String TRANSPORT_FLASH="flash";
+ /** ServletContext attribute name used to obtain the Bayeux object */
+ public static final String DOJOX_COMETD_BAYEUX="dojox.cometd.bayeux";
+ /*http field names*/
+ /**http helpers - text/json content type*/
+ public static final String JSON_CONTENT_TYPE="text/json";
+ /**http helpers - parameter name for json message*/
+ public static final String MESSAGE_PARAMETER="message";
+ /**http helpers - name of the jsonp parameter*/
+ public static final String JSONP_PARAMETER="jsonp";
+ /**http helpers - default name of the jsonp callback function*/
+ public static final String JSONP_DEFAULT_NAME="jsonpcallback";
+
+ /*--Client----------------------------------------------------------- */
+ /**
+ * Creates a new server side client. This method is to be invoked
+ * by server side objects only. You cannot create a remote client by using this method.
+ * A client represents an entity that can subscribe to channels and publish and receive messages
+ * through these channels
+ * @param idprefix String - the prefix string for the id generated, can be null
+ * @param listener Listener - a callback object to be called when messages are to be delivered to the new client
+ * @return Client - returns an implementation of the client interface.
+ */
+ public Client newClient(String idprefix, Listener listener);
+
+ /**
+ * retrieve a client based on an ID. Will return null if the client doesn't exist.
+ * @param clientid String
+ * @return Client-null if the client doesn't exist.returns the client if it does.
+ */
+ public Client getClient(String clientid);
+
+ /**
+ * Returns a non modifiable list of all the clients that are currently active
+ * in this Bayeux session
+ * @return List<Client> - a list containing all clients. The List can not be modified.
+ */
+ public List<Client> getClients();
+
+ /**
+ * Returns true if a client with the given id exists.<br/>
+ * Same as executing <code>getClient(id)!=null</code>.
+ * @param clientId String
+ * @return boolean - true if the client exists
+ */
+ public boolean hasClient(String clientId);
+
+ /**
+ * Removes the client all together.
+ * This will unsubscribe the client to any channels it may be subscribed to
+ * and remove it from the list.
+ * @param client Client
+ * @return Client - returns the client that was removed, or null if no client was removed.
+ */
+ public Client remove(Client client);
+
+
+ /*--Channel---------------------------------------------------------- */
+ /**
+ * Returns the channel for a given channel id.
+ * If the channel doesn't exist, and the <code>create</code> parameter is set to true,
+ * the channel will be created and added to the list of active channels.<br/>
+ * if <code>create</code> is set to false, and the channel doesn't exist, null will be returned.
+ * @param channelId String - the id of the channel to be retrieved or created
+ * @param create boolean - true if the Bayeux impl should create the channel
+ * @return Channel - null if <code>create</code> is set to false and the channel doesn't exist,
+ * otherwise it returns a channel object.
+ */
+ public Channel getChannel(String channelId, boolean create);
+
+ /**
+ * Returns a list of currently active channels in this Bayeux session.
+ * @return List<Channel>
+ */
+ public List<Channel> getChannels();
+
+ /**
+ * Removes a channel from the Bayeux object.
+ * This will also unsubscribe all the clients currently subscribed to the
+ * the channel.
+ * @param channel Channel - the channel to be removed
+ * @return Channel - returns the channel that was removed, or null if no channel was removed.
+ */
+ public Channel remove(Channel channel);
+
+ /**
+ * returns true if a channel with the given channelId exists.
+ * <br/>Same as executing <code>Bayeux.getChannel(channelId,false)!=null</code>
+ * @param channelId String
+ * @return boolean - true if the channel exists.
+ */
+ public boolean hasChannel(String channelId);
+
+ /* --Message---------------------------------------------------------- */
+ /**
+ * Creates a new message to be sent by a server side client.
+ * @return Message - returns a new Message object, that has a unique id.
+ */
+ public Message newMessage(Client from);
+
+
+ /*--Security policy----------------------------------------------------------- */
+ /**
+ * Returns the security policy associated with this Bayeux session
+ * @return SecurityPolicy
+ */
+ public SecurityPolicy getSecurityPolicy();
+
+ /**
+ * Sets the security policy to be used in this Bayeux session
+ * @param securityPolicy SecurityPolicy
+ */
+ public void setSecurityPolicy(SecurityPolicy securityPolicy);
+
+}
\ No newline at end of file
Added: trunk/java/org/apache/cometd/bayeux/Channel.java
===================================================================
--- trunk/java/org/apache/cometd/bayeux/Channel.java (rev 0)
+++ trunk/java/org/apache/cometd/bayeux/Channel.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cometd.bayeux;
+
+import java.util.List;
+
+/**
+ * A Bayeux Channel represents a channel used to receive messages from and to publish messages to.
+ * In order to publish messages to or receive messages from, one must subscribe to the channel.
+ * This is easily done by invoking the <code>subscribe</code> method.
+ * A channel is created by calling the <code>Bayeux.getChannel(channelId,true)</code> method.
+ * A channel can be created either server side by invoking the getChannel, or client side
+ * by using the /meta/subscribe message without a wildcard.
+ * @author Greg Wilkins
+ * @author Filip Hanik
+ */
+public interface Channel
+{
+ /**
+ * Returns the id for this channel. The id is unique within bayeux session.
+ * @return String - will never be null.
+ */
+ public String getId();
+
+ /**
+ * Publishes a message to all the subscribers of this channel.
+ * The <code>from</code> is contained within the message, by calling
+ * <code>msg.getClient()</code>
+ * @param data - the message to be published, can not be null.
+ */
+ public void publish(Message msg);
+
+ /**
+ * Publishes more than one message to all the subscribers of this channel.
+ * The <code>from</code> is contained within the message, by calling
+ * <code>msg[x].getClient()</code>
+ * @param data - the message to be published, can not be null.
+ */
+ public void publish(Message[] msgs);
+
+ /**
+ * Non persistent channels are removed when the last subscription is
+ * removed. Persistent channels survive periods without any subscribers.
+ * @return true if the Channel will persist without any subscription.
+ */
+ public boolean isPersistent();
+
+ /**
+ * @param persistent true if the Channel will persist without any subscription.
+ * @see isPersistent
+ */
+ public void setPersistent(boolean persistent);
+
+ /**
+ * Subscribes a client to a channel.
+ * @param subscriber - the client to be subscribed. If the client
+ * already is subscribed, this call will not create a duplicate subscription.
+ */
+ public void subscribe(Client subscriber);
+
+ /**
+ * Unsubscribes a client from a channel
+ * @param subscriber - the client to be subscribed.
+ * @return - returns the client that was unsubscribed, or null if the client wasn't subscribed.
+ */
+ public Client unsubscribe(Client subscriber);
+
+ /**
+ * returns a non modifiable list of all the subscribers to this
+ * channel.
+ * @return a list of subscribers
+ */
+ public List<Client> getSubscribers();
+
+ /**
+ * Adds a data filter to this channel. All messages received by this channel
+ * will run through this filter.
+ * @param filter Filter
+ */
+ public void addFilter(DataFilter filter);
+
+ /**
+ * Removes a filter from this channel.
+ * returns the filter that was removed, or null if the filter wasn't in the channel.
+ * @param filter Filter
+ * @return Filter - null if no filter was removed otherwise it returns the filter that was removed.
+ */
+ public DataFilter removeFilter(DataFilter filter);
+}
\ No newline at end of file
Added: trunk/java/org/apache/cometd/bayeux/Client.java
===================================================================
--- trunk/java/org/apache/cometd/bayeux/Client.java (rev 0)
+++ trunk/java/org/apache/cometd/bayeux/Client.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cometd.bayeux;
+
+
+
+/** A Bayeux Client.
+ * <p>
+ * A client may subscribe to channels and publish messages to channels.
+ * Client instances should not be directly created by uses, but should
+ * be obtained via the {@link Bayeux#getClient(String)} or {@link Bayeux#newClient(String, Listener)}
+ * methods.
+ * </p>
+ * <p>
+ * Three types of client may be represented by this interface:<nl>
+ * <li>The server representation of a remote client connected via HTTP,
+ * automatically created by the Bayeux server when a connect message comes in</li>
+ * <li>A server side client, created by the application using the {@link Bayeux#newClient(String, Listener)} method</li>
+ * <li>A java client connected to a remote Bayeux server - not implemented</li>
+ * </nl>
+ * @author Greg Wilkins
+ * @author Filip Hanik
+ */
+public interface Client
+{
+ /**
+ * Returns a unique id for this client. The id is unique within this Bayeux session.
+ * @return String - will not be null
+ */
+ public String getId();
+
+ /**
+ * Returns true if this client is holding messages to be delivered to the remote client.
+ * This method always returns false for local clients, since messages are delivered instantly using the
+ * Listener(callback) object
+ * @return boolean
+ */
+ public boolean hasMessages();
+
+ /**
+ * Deliver a message to this client only
+ * Deliver a message directly to the client. The message is not
+ * filtered or published to a channel.
+ * @param message
+ */
+ public void deliver(Message message);
+
+ /**
+ * Deliver a batch of messages to this client only
+ * Deliver a batch messages directly to the client. The messages are not
+ * filtered or published to a channel.
+ * @param message
+ */
+ public void deliver(Message[] message);
+
+ /**
+ * @return True if the client is local. False if this client is either a remote HTTP client or
+ * a java client to a remote server.
+ */
+ public boolean isLocal();
+
+ /**
+ * Starts a batch, no messages will be delivered until endBatch is called.
+ * Batches can be nested, and messages will only be delivered after
+ * the last endBatch has been called.
+ */
+ public void startBatch();
+
+ /**
+ * Ends a batch. since batches can be nested, messages will only be delivered
+ * after the endBatch has been called as many times as startBatch has.
+ */
+ public void endBatch();
+
+
+}
\ No newline at end of file
Added: trunk/java/org/apache/cometd/bayeux/DataFilter.java
===================================================================
--- trunk/java/org/apache/cometd/bayeux/DataFilter.java (rev 0)
+++ trunk/java/org/apache/cometd/bayeux/DataFilter.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cometd.bayeux;
+
+/**
+ * Data Filter<br/>
+ * Data filters are used to transform data as it is sent to a Channel.
+ * Messages are filtered as the message is published to a channel, invoking the
+ * {@link Channel#publish(Message)} method.<br/>
+ * This method gets invoked in two different scenarios, the first being when a message is received from
+ * a remote client, and the Bayeux implementation invokes the publish method directly.
+ * The second scenario is when a local client invokes {@link Channel#publish(Message)} directly in the local JVM.
+ * @author Greg Wilkins
+ * @author Filip Hanik
+ *
+ */
+public interface DataFilter
+{
+ /**
+ * Runs a message through the filter. Filtering can only modify an existing object, it can not replace it.
+ * @param data Message - the message to be filtered, may not be null
+ */
+ public void filter(Message data);
+}
Added: trunk/java/org/apache/cometd/bayeux/Listener.java
===================================================================
--- trunk/java/org/apache/cometd/bayeux/Listener.java (rev 0)
+++ trunk/java/org/apache/cometd/bayeux/Listener.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cometd.bayeux;
+
+/**
+ * Cometd Listener interface.<br/>
+ * For local clients, in order to receive messages, they pass in a callback object
+ * when the local client is created using the {@link Bayeux#newClient(String,Listener)} method.
+ * This callback object, implementing the Listener interface, is used to deliver messages to local, in JVM, clients.
+ * @author Greg Wilkins
+ * @author Filip Hanik
+ *
+ */
+public interface Listener
+{
+ /**
+ * This method is called when the client is removed (explicitly or from a timeout)
+ * @param timeout - true if the client was removed from a timeout
+ * false if it was removed explicitly.
+ */
+ public void removed(boolean timeout);
+
+ /**
+ * Invoked when a message is delivered to the client.
+ * The message contains the message itself, as well as what channel this message came through
+ * and who the sender is. If someone invoked {@link Client#deliver(Message)} then the channel reference will
+ * be null.
+ * @param msg
+ */
+ public void deliver(Message[] msg);
+}
Added: trunk/java/org/apache/cometd/bayeux/Message.java
===================================================================
--- trunk/java/org/apache/cometd/bayeux/Message.java (rev 0)
+++ trunk/java/org/apache/cometd/bayeux/Message.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cometd.bayeux;
+
+import java.util.Map;
+
+/**
+ * A Bayeux Message<br/>
+ * A Bayeux message is a Map of String/Object key value pairs representing the data in the message.
+ * The message contains information about the channel it was published through and who the sender was
+ *
+ * @author Greg Wilkins
+ * @author Filip Hanik
+ */
+public interface Message extends Map<String,Object>
+{
+ /**
+ * Returns a reference to the client that sent this message
+ * @return Client - may be null
+ */
+ public Client getClient();
+ /**
+ * Returns a reference to the channel that this message was published throuhg
+ * @return Channel - may be null
+ */
+ public Channel getChannel();
+ /**
+ * Returns the unique id of this message
+ * @return String
+ */
+ public String getId();
+
+ /**
+ * Sets the time to live in milliseconds. If the message hasn't been delivered
+ * when the time passed after the creation time is longer than the TTL the message will
+ * expire and removed from any delivery queues.
+ * @param ttl long
+ */
+ public void setTTL(long ttl);
+
+ /**
+ * Returns the time to live (in milliseconds) for this message
+ * @return long
+ */
+ public long getTTL();
+
+ /**
+ * returns the timestamp in milliseconds(System.currentTimeMillis()) of when this message was created.
+ * @return long
+ */
+ public long getCreationTime();
+}
+
+
Added: trunk/java/org/apache/cometd/bayeux/SecurityPolicy.java
===================================================================
--- trunk/java/org/apache/cometd/bayeux/SecurityPolicy.java (rev 0)
+++ trunk/java/org/apache/cometd/bayeux/SecurityPolicy.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cometd.bayeux;
+
+/**
+ * @author Greg Wilkins
+ */
+public interface SecurityPolicy
+{
+ boolean canHandshake(Message message);
+ boolean canCreate(Client client,String channel,Message message);
+ boolean canSubscribe(Client client,String channel,Message messsage);
+ boolean canPublish(Client client,String channel,Message messsage);
+}
Added: trunk/java/org/apache/tomcat/bayeux/BayeuxException.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/BayeuxException.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/BayeuxException.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+/**
+ *
+ * @author Filip Hanik
+ * @version 1.0
+ */
+public class BayeuxException extends Exception {
+ public BayeuxException() {
+ super();
+ }
+
+ public BayeuxException(String message) {
+ super(message);
+ }
+
+ public BayeuxException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public BayeuxException(Throwable cause) {
+ super(cause);
+ }
+}
\ No newline at end of file
Added: trunk/java/org/apache/tomcat/bayeux/BayeuxRequest.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/BayeuxRequest.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/BayeuxRequest.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+
+import org.apache.tomcat.bayeux.HttpError;
+
+/**
+ * An interface that defines methods for managing Bayeux request meta
+ * messages.
+ *
+ * @author Guy A. Molinari
+ * @author Filip Hanik
+ * @version 0.9
+ */
+public interface BayeuxRequest {
+
+ public static final String LAST_REQ_ATTR = "org.apache.cometd.bayeux.last_request";
+ public static final String CURRENT_REQ_ATTR = "org.apache.cometd.bayeux.current_request";
+ public static final String JSON_MSG_ARRAY = "org.apache.cometd.bayeux.json_msg_array";
+
+ /**
+ * Validates a specific request.
+ * This method must be called prior to process()
+ * as a request can do pre processing in the validate method.
+ * <br/>
+ * Should the validation fail, an error object is returned
+ * containing an error message, and potentially a stack trace
+ * if an exception was generated
+ * @return HttpError - null if no error was detected, an HttpError object containing information about the error.
+ */
+ public HttpError validate();
+
+ /**
+ * processes a remote client Bayeux message
+ * @param prevops - the operation requested by the previous request, in case of chained requests.
+ * @return int - returns the interest operation for a CometEvent. Currently not used
+ * @throws BayeuxException - if an error was detected, and the appropriate error response couldn't be delivered to the client.
+ */
+ public int process(int prevops) throws BayeuxException;
+}
Added: trunk/java/org/apache/tomcat/bayeux/BayeuxServlet.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/BayeuxServlet.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/BayeuxServlet.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,240 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+
+import java.io.IOException;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.tomcat.util.json.JSONArray;
+import org.apache.tomcat.util.json.JSONException;
+import org.apache.tomcat.util.json.JSONObject;
+import org.jboss.servlet.http.HttpEvent;
+import org.jboss.servlet.http.HttpEventServlet;
+
+/**
+ *
+ * @author Filip Hanik
+ * @author Guy Molinari
+ * @version 1.0
+ */
+public class BayeuxServlet implements HttpEventServlet {
+
+
+ /**
+ * The debugging detail level for this servlet.
+ */
+ protected int debug = 0;
+
+
+ /**
+ * Attribute to hold the TomcatBayeux object in the servlet context
+ */
+ public static final String TOMCAT_BAYEUX_ATTR = Bayeux.DOJOX_COMETD_BAYEUX;
+
+ /**
+ * Servlet config - for future use
+ */
+ protected ServletConfig servletConfig;
+
+ /**
+ * Reference to the global TomcatBayeux object
+ */
+ protected TomcatBayeux tb;
+
+ /**
+ * Upon servlet destruction, the servlet will clean up the
+ * TomcatBayeux object and terminate any outstanding events.
+ */
+ public void destroy() {
+ servletConfig = null;
+ //to do, close all outstanding comet events
+ //tb.destroy();
+ tb = null;//TO DO, close everything down
+
+ }
+
+ /**
+ * Returns the preconfigured connection timeout.
+ * If no timeout has been configured as a servlet init parameter named <code>timeout</code>
+ * then the default of 2min will be used.
+ * @return int - the timeout for a connection in milliseconds
+ */
+ protected int getTimeout() {
+ String timeoutS = servletConfig.getInitParameter("timeout");
+ int timeout = 120*1000; //2 min
+ try {
+ timeout = Integer.parseInt(timeoutS);
+ }catch (NumberFormatException nfe) {
+ //ignore, we have a default value
+ }
+ return timeout;
+ }
+
+ protected int getReconnectInterval() {
+ String rs = servletConfig.getInitParameter("reconnectInterval");
+ int rct = 5000; //5 seconds
+ try {
+ rct = Integer.parseInt(rs);
+ }catch (NumberFormatException nfe) {
+ //ignore, we have a default value
+ }
+ return rct;
+ }
+
+
+ public void event(HttpEvent cometEvent) throws IOException, ServletException {
+ HttpEvent.EventType type = cometEvent.getType();
+ if (debug > 0) {
+ getServletConfig().getServletContext().log("["+Thread.currentThread().getName()+"] Received Comet Event type="+type);
+ }
+ synchronized (cometEvent) {
+ switch (type) {
+ case BEGIN:
+ cometEvent.setTimeout(getTimeout());
+ break;
+ case READ:
+ checkBayeux(cometEvent);
+ break;
+ case EOF:
+ case EVENT:
+ case WRITE:
+ break;
+ case ERROR:
+ case END:
+ case TIMEOUT:
+ tb.remove(cometEvent);
+ cometEvent.close();
+ break;
+ }
+ }//synchronized
+ }//event
+
+ /**
+ *
+ * @param cometEvent CometEvent
+ * @return boolean - true if we comet event stays open
+ * @throws IOException
+ * @throws UnsupportedOperationException
+ */
+ protected void checkBayeux(HttpEvent cometEvent) throws IOException, UnsupportedOperationException {
+ //we actually have data.
+ //data can be text/json or
+ if (Bayeux.JSON_CONTENT_TYPE.equals(cometEvent.getHttpServletRequest().getContentType())) {
+ //read and decode the bytes according to content length
+ getServletConfig().getServletContext().log("["+Thread.currentThread().getName()+"] JSON encoding not supported, will throw an exception and abort the request.");
+ int contentlength = cometEvent.getHttpServletRequest().getContentLength();
+ throw new UnsupportedOperationException("Decoding "+Bayeux.JSON_CONTENT_TYPE+" not yet implemented.");
+ } else { //GET method or application/x-www-form-urlencoded
+ String message = cometEvent.getHttpServletRequest().getParameter(Bayeux.MESSAGE_PARAMETER);
+ if (debug > 0) {
+ getServletConfig().getServletContext().log("["+Thread.currentThread().getName()+"] Received JSON message:"+message);
+ }
+ try {
+ int action = handleBayeux(message, cometEvent);
+ if (debug > 0) {
+ getServletConfig().getServletContext().log("["+Thread.currentThread().getName()+"] Bayeux handling complete, action result="+action);
+ }
+ if (action<=0) {
+ cometEvent.close();
+ }
+ }catch (Exception x) {
+ tb.remove(cometEvent);
+ getServletConfig().getServletContext().log(x, "Exception in check");
+ cometEvent.close();
+ }
+ }
+ }
+
+ protected int handleBayeux(String message, HttpEvent event) throws IOException, ServletException {
+ int result = 0;
+ if (message==null || message.length()==0) return result;
+ try {
+ BayeuxRequest request = null;
+ //a message can be an array of messages
+ JSONArray jsArray = new JSONArray(message);
+ for (int i = 0; i < jsArray.length(); i++) {
+ JSONObject msg = jsArray.getJSONObject(i);
+
+ if (debug > 0) {
+ getServletConfig().getServletContext().log("["+Thread.currentThread().getName()+"] Processing bayeux message:"+msg);
+ }
+ request = RequestFactory.getRequest(tb,event,msg);
+ if (debug > 0) {
+ getServletConfig().getServletContext().log("["+Thread.currentThread().getName()+"] Processing bayeux message using request:"+request);
+ }
+ result = request.process(result);
+ if (debug > 0) {
+ getServletConfig().getServletContext().log("["+Thread.currentThread().getName()+"] Processing bayeux message result:"+result);
+ }
+ }
+ if (result>0 && request!=null) {
+ event.getHttpServletRequest().setAttribute(BayeuxRequest.LAST_REQ_ATTR, request);
+ ClientImpl ci = (ClientImpl)tb.getClient(((RequestBase)request).getClientId());
+ ci.addCometEvent(event);
+ if (debug > 0) {
+ getServletConfig().getServletContext().log("["+Thread.currentThread().getName()+"] Done bayeux message added to request attribute");
+ }
+ } else if (result == 0 && request!=null) {
+ RequestBase.deliver(event,(ClientImpl)tb.getClient(((RequestBase)request).getClientId()));
+ if (debug > 0) {
+ getServletConfig().getServletContext().log("["+Thread.currentThread().getName()+"] Done bayeux message, delivered to client");
+ }
+ }
+
+ }catch (JSONException x) {
+ getServletConfig().getServletContext().log(x, "Error");//to do impl error handling
+ result = -1;
+ }catch (BayeuxException x) {
+ getServletConfig().getServletContext().log(x, "Error"); //to do impl error handling
+ result = -1;
+ }
+ return result;
+ }
+
+ public ServletConfig getServletConfig() {
+ return servletConfig;
+ }
+
+ public String getServletInfo() {
+ return "Tomcat/BayeuxServlet/1.0";
+ }
+
+ public void init(ServletConfig servletConfig) throws ServletException {
+
+ this.servletConfig = servletConfig;
+ ServletContext ctx = servletConfig.getServletContext();
+ if (ctx.getAttribute(TOMCAT_BAYEUX_ATTR)==null)
+ ctx.setAttribute(TOMCAT_BAYEUX_ATTR,new TomcatBayeux());
+ this.tb = (TomcatBayeux)ctx.getAttribute(TOMCAT_BAYEUX_ATTR);
+ tb.setReconnectInterval(getReconnectInterval());
+ }
+
+ public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
+ if (servletResponse instanceof HttpServletResponse) {
+ ( (HttpServletResponse) servletResponse).sendError(500, "Misconfigured Tomcat server, must be configured to support Comet operations.");
+ } else {
+ throw new ServletException("Misconfigured Tomcat server, must be configured to support Comet operations for the Bayeux protocol.");
+ }
+ }
+}
Added: trunk/java/org/apache/tomcat/bayeux/ChannelImpl.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/ChannelImpl.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/ChannelImpl.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.cometd.bayeux.Channel;
+import org.apache.cometd.bayeux.Client;
+import org.apache.cometd.bayeux.DataFilter;
+import org.apache.cometd.bayeux.Message;
+
+/**
+ *
+ * @author Filip Hanik
+ * @version 1.0
+ */
+public class ChannelImpl implements Channel {
+
+ /**
+ * The unique id of this channel
+ */
+ protected String id = null;
+
+ /**
+ * A list of the current subscribers
+ */
+ protected LinkedList<Client> subscribers = new LinkedList<Client>();
+
+ /**
+ * A list of the current filters
+ */
+ protected LinkedList<DataFilter> filters = new LinkedList<DataFilter>();
+
+ /**
+ * Is this channel persistent, default value is true
+ */
+ protected boolean persistent = true;
+
+ /**
+ * Creates a new channel
+ * @param id String - the id of the channel, can not be null
+ */
+ protected ChannelImpl(String id) {
+ assert id != null;
+ this.id = id;
+ }
+
+ /**
+ * returns the id of this channel
+ * @return String
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * Returns true if this channel matches the pattern to its id.
+ * The channel pattern can be a complete name like <code>/service/mychannel</code>
+ * or it can be a wild card pattern like <code>/service/app2/**</code>
+ * @param pattern String according to the Bayeux specification section 2.2.1 Channel Globbing, can not be null.
+ * @return boolean true if the id of this channel matches the pattern
+ */
+ public boolean matches(String pattern) {
+ if (pattern == null)
+ throw new NullPointerException("Channel pattern must not be null.");
+ if (getId().equals(pattern))
+ return true;
+ int wildcardPos = pattern.indexOf("/*");
+ if (wildcardPos == -1)
+ return false;
+ boolean multiSegment = pattern.indexOf("**") != -1;
+ String leadSubstring = pattern.substring(0, wildcardPos);
+ if (leadSubstring == null)
+ return false;
+ if (multiSegment)
+ return getId().startsWith(leadSubstring);
+ else {
+ if (getId().length() <= wildcardPos + 2)
+ return false;
+ return !(getId().substring(wildcardPos + 2).contains("/"));
+ }
+ }
+
+
+
+ /**
+ * @return returns a non modifiable list of the subscribers for this channel.
+ */
+ public List<Client> getSubscribers() {
+ return Collections.unmodifiableList(subscribers);
+ }
+
+ /**
+ * @return true if the Channel will persist without any subscription.
+ */
+ public boolean isPersistent() {
+ return persistent;
+ }
+
+ public void publish(Message msg) {
+ publish(new Message[] {msg});
+ }
+
+ public void publish(Message[] msgs) {
+ if (msgs==null) return;
+ MessageImpl[] imsgs = new MessageImpl[msgs.length];
+ for (int i=0; msgs!=null && i<msgs.length; i++) {
+ Message data = msgs[i];
+
+ if (!(data instanceof MessageImpl))
+ throw new IllegalArgumentException("Invalid message class, you can only publish messages "+
+ "created through the Bayeux.newMessage() method");
+ /*if (log.isDebugEnabled()) {
+ log.debug("Publishing message:"+data+" to channel:"+this);
+ }*/
+ //clone it so that we can set this channel as a reference
+ MessageImpl msg = (MessageImpl)((MessageImpl)data).clone();
+ //this is the channel it was delivered through
+ msg.setChannel(this);
+ //pass through filters
+ for (Iterator<DataFilter> it = filters.iterator(); it.hasNext(); ) {
+ it.next().filter(msg);
+ }
+ imsgs[i] = msg;
+ }
+ //deliver it to the clients
+ for (Iterator<Client> it = subscribers.iterator(); it.hasNext(); ) {
+ ClientImpl c = (ClientImpl)it.next();
+ c.deliverInternal(this,imsgs);
+ }
+
+ }
+
+ public void setPersistent(boolean persistent) {
+ this.persistent = persistent;
+ }
+
+ public void subscribe(Client subscriber) {
+ if (!subscribers.contains((subscriber))) {
+ subscribers.addLast(subscriber);
+ ((ClientImpl)subscriber).subscribed(this);
+ }
+ }
+
+ public Client unsubscribe(Client subscriber) {
+ if (subscribers.remove(subscriber)) {
+ ((ClientImpl)subscriber).unsubscribed(this);
+ return subscriber;
+ } else
+ return null;
+ }
+
+ public void addFilter(DataFilter filter) {
+ if (!filters.contains(filter))
+ filters.addLast(filter);
+ }
+
+ public DataFilter removeFilter(DataFilter filter) {
+ if ( filters.remove(filter) ) return filter;
+ else return null;
+ }
+
+ public String toString() {
+ StringBuffer buf = new StringBuffer(super.toString());
+ buf.append("; channelId=").append(getId());
+ return buf.toString();
+ }
+
+}
\ No newline at end of file
Added: trunk/java/org/apache/tomcat/bayeux/ClientImpl.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/ClientImpl.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/ClientImpl.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,276 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.cometd.bayeux.Client;
+import org.apache.cometd.bayeux.Listener;
+import org.apache.cometd.bayeux.Message;
+import org.apache.tomcat.util.json.JSONObject;
+import org.jboss.servlet.http.HttpEvent;
+
+public class ClientImpl implements Client {
+
+ public static final int SUPPORT_CALLBACK_POLL = 0x1;
+ public static final int SUPPORT_LONG_POLL = 0x2;
+
+ public static final String COMET_EVENT_ATTR = "org.apache.cometd.bayeux.client";
+
+ protected static LinkedList<Message> EMPTY_LIST = new LinkedList<Message>();
+ /**
+ * queued message for remote clients.
+ */
+ protected LinkedList<Message> messages = null;
+
+ /**
+ *
+ */
+ protected Queue<HttpEvent> events = new LinkedList<HttpEvent>();
+
+ /**
+ * Unique id representing this client
+ */
+ protected String id;
+
+ /**
+ * supported connection types, defaults to long-polling
+ */
+ protected int supportedConnTypes = SUPPORT_LONG_POLL | SUPPORT_CALLBACK_POLL;
+
+ /**
+ * The desired connection type
+ */
+ protected int desirectConnType = SUPPORT_LONG_POLL;
+
+ /**
+ * Does this client use json-comment-filtered messages
+ */
+ protected boolean useJsonFiltered = false;
+
+ /**
+ * Same JVM clients, get local=true
+ */
+ protected boolean local;
+
+ /**
+ * The callback object for local clients
+ */
+ protected Listener listener;
+
+ protected AtomicInteger nrofsubscriptions = new AtomicInteger(0);
+
+ protected ClientImpl(String id, boolean local) {
+ this.id = id;
+ this.local = local;
+ if (!local) messages = new LinkedList<Message>();
+ }
+
+ protected ClientImpl(String id, HttpEvent event) {
+ this(id,false);
+ events = new ConcurrentLinkedQueue<HttpEvent>();
+ addCometEvent(event);
+ }
+
+ public synchronized void deliver(Message message) {
+ deliverInternal(null,new MessageImpl[] {(MessageImpl)message});
+ }
+
+ public synchronized void deliver(Message[] message) {
+ deliverInternal(null,message);
+ }
+
+ protected synchronized void deliverInternal(ChannelImpl channel, MessageImpl message) {
+ deliverInternal(channel,new MessageImpl[] {message});
+ }
+
+ protected synchronized void deliverInternal(ChannelImpl channel, Message[] msgs) {
+ if (isLocal()) {
+ //local clients must have a listener
+ ArrayList<Message> list = new ArrayList<Message>();
+ for (int i=0; msgs!=null && i<msgs.length; i++) {
+ if (this!=msgs[i].getClient()) list.add(msgs[i]);
+ }
+ if (getListener() != null) {
+ getListener().deliver(list.toArray(new Message[0]));
+ }
+ } else {
+ for (int i=0; msgs!=null && i<msgs.length; i++) {
+ MessageImpl message = (MessageImpl)msgs[i];
+ if (this==message.getClient()) {
+ //dont deliver to ourself
+ continue;
+ }
+ //we are not implementing forever responses, if the client is connected
+ //then we will fire off the message
+ //first we check to see if we have any existing connections we can piggy back on
+ HttpEvent event = events.poll();
+ boolean delivered = false;
+ //TODO TODO - check on thread safety, for writing and for getting last request.
+ if (event!=null) {
+ synchronized (event) {
+ RequestBase rq = (RequestBase)event.getHttpServletRequest().getAttribute(RequestBase.LAST_REQ_ATTR);
+ if (rq!=null) {
+ Map map = new HashMap();
+ try {
+ map.put(Bayeux.CHANNEL_FIELD,message.getChannel().getId());
+ map.put(Bayeux.DATA_FIELD,message);
+ JSONObject json = new JSONObject(map);
+ /*if (log.isDebugEnabled()) {
+ log.debug("Message instantly delivered to remote client["+this+"] message:"+json);
+ }*/
+ rq.addToDeliveryQueue(this, json);
+ //deliver the batch
+ if (i==(msgs.length-1)) {
+ rq.deliver(event, this);
+ event.close(); //todo, figure out a better way, this means only one message gets delivered
+ removeCometEvent(event); //and delivered instantly
+ }
+ delivered = true;
+ } catch (Exception x) {
+ // TODO: fix
+ x.printStackTrace();
+ //log.error(x);
+ }
+ }
+ }
+ }
+ if (!delivered) {
+ /*if (log.isDebugEnabled()) {
+ log.debug("Message added to queue for remote client["+this+"] message:"+message);
+ }*/
+ //queue the message for the next round
+ messages.add(message);
+ }
+ }
+ }
+ }
+
+ public String getId() {
+ return this.id;
+ }
+
+ protected Listener getListener() {
+ return listener;
+ }
+
+ public boolean hasMessages() {
+ if (isLocal()) return false;
+ else {
+ return messages.size() > 0;
+ }
+ }
+
+ public boolean isLocal() {
+ return local;
+ }
+
+ public int getSupportedConnTypes() {
+ return supportedConnTypes;
+ }
+
+ public int getDesirectConnType() {
+ return desirectConnType;
+ }
+
+ public boolean useJsonFiltered() {
+ return useJsonFiltered;
+ }
+
+ public void setListener(Listener listener) {
+ this.listener = listener;
+ }
+
+ public void setSupportedConnTypes(int supportedConnTypes) {
+ this.supportedConnTypes = supportedConnTypes;
+ }
+
+ public void setUseJsonFiltered(boolean useJsonFiltered) {
+ this.useJsonFiltered = useJsonFiltered;
+ }
+
+ public void setDesirectConnType(int desirectConnType) {
+ this.desirectConnType = desirectConnType;
+ }
+
+ public boolean supportsCallbackPoll() {
+ return (supportedConnTypes & SUPPORT_CALLBACK_POLL) == SUPPORT_CALLBACK_POLL;
+ }
+
+ public boolean supportsLongPoll() {
+ return (supportedConnTypes & SUPPORT_LONG_POLL) == SUPPORT_LONG_POLL;
+ }
+
+ public synchronized List<Message> takeMessages() {
+ if (isLocal()) return null;
+ if (messages.size()==0) return EMPTY_LIST;
+ List result = new LinkedList(messages);
+ messages.clear();
+ return result;
+ }
+
+ public String toString() {
+ StringBuffer buf = new StringBuffer(super.toString());
+ buf.append(" id=").append(getId());
+ return buf.toString();
+ }
+
+ public boolean isSubscribed() {
+ return nrofsubscriptions.get()>0;
+ }
+
+ protected synchronized boolean addCometEvent(HttpEvent event) {
+ boolean result = false;
+ if (!events.contains(event)) {
+ events.add(event);
+ result = true;
+ }
+ event.getHttpServletRequest().setAttribute(COMET_EVENT_ATTR,this);
+ return result;
+ }
+
+ protected synchronized boolean removeCometEvent(HttpEvent event) {
+ boolean result = events.remove(event);
+ event.getHttpServletRequest().removeAttribute(COMET_EVENT_ATTR);
+ return result;
+ }
+
+
+ protected void subscribed(ChannelImpl ch) {
+ nrofsubscriptions.addAndGet(1);
+ }
+
+ protected void unsubscribed(ChannelImpl ch) {
+ nrofsubscriptions.addAndGet(-1);
+ }
+
+ public void startBatch(){
+ //noop until improved
+ }
+ public void endBatch() {
+ //noop until improved
+ }
+
+}
Added: trunk/java/org/apache/tomcat/bayeux/HttpError.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/HttpError.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/HttpError.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+
+public class HttpError {
+ private int code;
+ private String status;
+ private Throwable cause;
+ public HttpError(int code, String status, Throwable cause) {
+ this.code = code;
+ this.status = status;
+ this.cause = cause;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public void setCause(Throwable exception) {
+ this.cause = exception;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public Throwable getCause() {
+ return cause;
+ }
+
+ public String toString() {
+ if (cause != null)
+ return code + ":" + status + " - [" + cause + "]";
+ else
+ return code + ":" + status;
+ }
+}
Added: trunk/java/org/apache/tomcat/bayeux/MessageImpl.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/MessageImpl.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/MessageImpl.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+
+import java.util.HashMap;
+
+import org.apache.cometd.bayeux.Channel;
+import org.apache.cometd.bayeux.Client;
+import org.apache.cometd.bayeux.Message;
+
+public class MessageImpl extends HashMap<String,Object> implements Message {
+
+ protected Channel channel;
+ protected Client client;
+ protected String id;
+ private long TTL = 1000*60*5; //5min is the default TTL for a message
+ protected long creationTime = System.currentTimeMillis();
+
+ public Object clone() {
+ MessageImpl copy = new MessageImpl(id);
+ copy.putAll(this);
+ copy.channel = channel;
+ copy.client = client;
+ copy.id = id;
+ copy.creationTime = creationTime;
+ copy.TTL = TTL;
+ return copy;
+ }
+
+ protected MessageImpl(String id) {
+ assert id != null;
+ this.id = id;
+ }
+
+ public Channel getChannel() {
+ return channel;
+ }
+
+ public Client getClient() {
+ return client;
+ }
+
+ public long getCreationTime() {
+ return creationTime;
+ }
+
+ public long getTTL() {
+ return TTL;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ protected void setChannel(Channel channel) {
+ this.channel = channel;
+ }
+
+ protected void setClient(Client client) {
+ this.client = client;
+ }
+
+ public void setTTL(long TTL) {
+ this.TTL = TTL;
+ }
+}
\ No newline at end of file
Added: trunk/java/org/apache/tomcat/bayeux/RequestBase.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/RequestBase.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/RequestBase.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,254 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+
+import javax.servlet.ServletException;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.cometd.bayeux.Message;
+import org.apache.tomcat.util.json.JSONArray;
+import org.apache.tomcat.util.json.JSONException;
+import org.apache.tomcat.util.json.JSONObject;
+import org.jboss.servlet.http.HttpEvent;
+
+/**
+ * Common functionality and member variables for all Bayeux requests.
+ *
+ * @author Guy A. Molinari
+ * @author Filip Hanik
+ * @version 0.9
+ *
+ */
+public abstract class RequestBase implements BayeuxRequest {
+
+ protected static final SimpleDateFormat timestampFmt =
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
+ static {
+ timestampFmt.setTimeZone(TimeZone.getTimeZone("GMT"));
+ }
+ //message properties, combined for all messages
+ protected TomcatBayeux tomcatBayeux;
+ protected String channel;
+ protected String id;
+ protected String clientId;
+ protected String version = null;
+ protected String[] suppConnTypes = null;
+ protected int suppConnTypesFlag = 0;
+ protected int desiredConnTypeFlag = 0;
+ protected String minVersion = null;
+ protected String subscription = null;
+ protected String data = null;
+ protected String conType = null;
+ protected LinkedHashMap<String, Object> ext = new LinkedHashMap<String, Object> ();
+
+
+ protected HttpEvent event;
+
+ protected HashMap<String, Object> response = null;
+
+ protected int reconnectInterval;
+
+ protected RequestBase(TomcatBayeux tb, HttpEvent event, JSONObject jsReq) throws JSONException {
+ this.tomcatBayeux = tb;
+ this.event = event;
+ channel = jsReq.optString(Bayeux.CHANNEL_FIELD);
+ id = jsReq.optString(Bayeux.ID_FIELD);
+ clientId = jsReq.optString(Bayeux.CLIENT_FIELD);
+ version = jsReq.optString(Bayeux.VERSION_FIELD);
+ minVersion = jsReq.optString(Bayeux.MIN_VERSION_FIELD);
+ conType = jsReq.optString(Bayeux.CONNECTION_TYPE_FIELD);
+ subscription = jsReq.optString(Bayeux.SUBSCRIPTION_FIELD);
+ data = jsReq.optString(Bayeux.DATA_FIELD);
+ reconnectInterval = tb.getReconnectInterval();
+ if (jsReq.has(Bayeux.EXT_FIELD)) {
+ JSONObject jext = jsReq.getJSONObject(Bayeux.EXT_FIELD);
+ for (Iterator<String> i = jext.keys(); i.hasNext(); ) {
+ String key = i.next();
+ ext.put(key, jext.get(key));
+ }//for
+ }//end if
+
+ if (jsReq.has(Bayeux.SUPP_CONNECTION_TYPE_FIELD)) {
+ JSONArray types = jsReq.getJSONArray(Bayeux.SUPP_CONNECTION_TYPE_FIELD);
+ suppConnTypes = new String[types.length()];
+ for (int i = 0; i < types.length(); i++) {
+ suppConnTypes[i] = types.getString(i);
+ if (Bayeux.TRANSPORT_CALLBACK_POLL.equals(suppConnTypes[i]))
+ suppConnTypesFlag = suppConnTypesFlag|ClientImpl.SUPPORT_CALLBACK_POLL;
+ else if (Bayeux.TRANSPORT_LONG_POLL.equals(suppConnTypes[i]))
+ suppConnTypesFlag = suppConnTypesFlag|ClientImpl.SUPPORT_LONG_POLL;
+ }//for
+ }//end if
+
+ if (conType!=null) {
+ if (Bayeux.TRANSPORT_CALLBACK_POLL.equals(conType))
+ desiredConnTypeFlag = ClientImpl.SUPPORT_CALLBACK_POLL;
+ else if (Bayeux.TRANSPORT_LONG_POLL.equals(conType))
+ desiredConnTypeFlag = ClientImpl.SUPPORT_LONG_POLL;
+ }//end if
+
+ //due to the fact that the javascript doesn't send up a required field
+ //we have to fake it
+ suppConnTypesFlag = ClientImpl.SUPPORT_CALLBACK_POLL | ClientImpl.SUPPORT_LONG_POLL;
+
+ }
+
+ public HttpError validate() {
+ HttpError result = null;
+// if (clientId == null) {
+// result = new HttpError(401,"No Client ID.", null);
+// }
+ return result;
+ }
+
+ public TomcatBayeux getTomcatBayeux() {
+ return tomcatBayeux;
+ }
+
+ public String getChannel() {
+ return channel;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getClientId() {
+ return clientId;
+ }
+
+ public LinkedHashMap getExt() {
+ return ext;
+ }
+
+ public HttpEvent getEvent() {
+ return event;
+ }
+
+ protected static void deliver(HttpEvent event, ClientImpl to) throws IOException, ServletException, BayeuxException {
+ JSONArray jarray = getJSONArray(event,true);
+ if ( jarray == null ) throw new BayeuxException("No message to send!");
+ String jsonstring = jarray.toString();
+ /*if (log.isDebugEnabled()) {
+ log.debug("["+Thread.currentThread().getName()+"] Delivering message to[" + to + "] message:" + jsonstring);
+ }*/
+
+ if (to!=null) {
+ if (to.useJsonFiltered()) {
+ if (!event.getHttpServletResponse().isCommitted()) event.getHttpServletResponse().setContentType("text/json-comment-filtered");
+ }else {
+ if (!event.getHttpServletResponse().isCommitted()) event.getHttpServletResponse().setContentType("text/json");
+ }
+ }
+
+ PrintWriter out = event.getHttpServletResponse().getWriter();
+ if (to==null) {
+ //do nothing
+ }else if ( (to.getDesirectConnType() == 0 && to.supportsLongPoll()) || to.getDesirectConnType() == ClientImpl.SUPPORT_LONG_POLL) {
+ if (to.useJsonFiltered())
+ out.print("/*");
+ } else if ( (to.getDesirectConnType() == 0 && to.supportsCallbackPoll()) || to.getDesirectConnType() == ClientImpl.SUPPORT_CALLBACK_POLL) {
+ String jsonp = event.getHttpServletRequest().getParameter(Bayeux.JSONP_PARAMETER);
+ if (jsonp == null)
+ jsonp = Bayeux.JSONP_DEFAULT_NAME;
+ out.print(jsonp);
+ out.print('(');
+ } else {
+ throw new BayeuxException("Client doesn't support any appropriate connection type.");
+ }
+ out.print(jsonstring);
+ if ( to == null ) {
+ //do nothing
+ } else if ( (to.getDesirectConnType() == 0 && to.supportsLongPoll()) || to.getDesirectConnType() == ClientImpl.SUPPORT_LONG_POLL) {
+ if (to.useJsonFiltered())
+ out.print("*/");
+ } else if ( (to.getDesirectConnType() == 0 && to.supportsCallbackPoll()) || to.getDesirectConnType() == ClientImpl.SUPPORT_CALLBACK_POLL) {
+ out.print(");");
+ }
+ out.flush();
+ event.getHttpServletResponse().flushBuffer();
+
+
+ }
+
+ protected static JSONArray getJSONArray(HttpEvent event, boolean nullok) {
+ synchronized(event) {
+ JSONArray jarray = (JSONArray) event.getHttpServletRequest().getAttribute(JSON_MSG_ARRAY);
+ if (jarray == null && (!nullok)) {
+ jarray = new JSONArray();
+ event.getHttpServletRequest().setAttribute(JSON_MSG_ARRAY, jarray);
+ }
+ return jarray;
+ }
+ }
+
+ protected JSONArray getJSONArray() {
+ return getJSONArray(event,false);
+ }
+
+ protected void addToDeliveryQueue(ClientImpl to, JSONObject msg) throws IOException, ServletException, BayeuxException {
+ synchronized (event) {
+ getJSONArray().put(msg);
+ }
+ }
+
+ protected void flushMessages(ClientImpl client) throws BayeuxException {
+ List<Message> msgs = client.takeMessages();
+ synchronized (event) {
+ try {
+ for (Iterator<Message> it = msgs.iterator(); it.hasNext(); ){
+ MessageImpl msg = (MessageImpl)it.next();
+ Map map = new HashMap();
+ map.put(Bayeux.CHANNEL_FIELD,msg.getChannel().getId());
+ if (msg.getClient()!=null) map.put(Bayeux.CLIENT_FIELD,msg.getClient().getId());
+ map.put(Bayeux.DATA_FIELD,msg);
+ JSONObject obj = new JSONObject(map);
+ addToDeliveryQueue(client, obj);
+ }
+ } catch (ServletException x) {
+ throw new BayeuxException(x);
+ } catch (IOException x) {
+ throw new BayeuxException(x);
+ }
+ }
+ }
+
+ public int process(int prevops) throws BayeuxException {
+ event.getHttpServletRequest().setAttribute(CURRENT_REQ_ATTR,this);
+ return prevops;
+ }
+
+ public int getReconnectInterval() {
+ return reconnectInterval;
+ }
+
+ public String getTimeStamp() {
+ return timestampFmt.format(new Date(System.currentTimeMillis()));
+ }
+
+}
Added: trunk/java/org/apache/tomcat/bayeux/RequestFactory.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/RequestFactory.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/RequestFactory.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.tomcat.bayeux.request.MetaConnectRequest;
+import org.apache.tomcat.bayeux.request.MetaDisconnectRequest;
+import org.apache.tomcat.bayeux.request.MetaHandshakeRequest;
+import org.apache.tomcat.bayeux.request.MetaSubscribeRequest;
+import org.apache.tomcat.bayeux.request.MetaUnsubscribeRequest;
+import org.apache.tomcat.bayeux.request.PublishRequest;
+import org.apache.tomcat.util.json.JSONException;
+import org.apache.tomcat.util.json.JSONObject;
+import org.jboss.servlet.http.HttpEvent;
+
+public class RequestFactory {
+
+ public static BayeuxRequest getRequest(TomcatBayeux tomcatBayeux, HttpEvent event, JSONObject msg) throws JSONException {
+ String channel = msg.optString(Bayeux.CHANNEL_FIELD);
+ if (Bayeux.META_HANDSHAKE.equals(channel)) {
+ return new MetaHandshakeRequest(tomcatBayeux,event,msg);
+ }else if (Bayeux.META_CONNECT.equals(channel)) {
+ return new MetaConnectRequest(tomcatBayeux,event,msg);
+ }else if (Bayeux.META_DISCONNECT.equals(channel)) {
+ return new MetaDisconnectRequest(tomcatBayeux,event,msg);
+ }else if (Bayeux.META_SUBSCRIBE.equals(channel)) {
+ return new MetaSubscribeRequest(tomcatBayeux,event,msg);
+ }else if (Bayeux.META_UNSUBSCRIBE.equals(channel)) {
+ return new MetaUnsubscribeRequest(tomcatBayeux,event,msg);
+ } else {
+ return new PublishRequest(tomcatBayeux,event,msg);
+ }
+ }
+}
\ No newline at end of file
Added: trunk/java/org/apache/tomcat/bayeux/TomcatBayeux.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/TomcatBayeux.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/TomcatBayeux.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.cometd.bayeux.Channel;
+import org.apache.cometd.bayeux.Client;
+import org.apache.cometd.bayeux.Listener;
+import org.apache.cometd.bayeux.Message;
+import org.apache.cometd.bayeux.SecurityPolicy;
+import org.jboss.servlet.http.HttpEvent;
+/**
+ *
+ * @author Filip Hanik
+ * @version 1.0
+ */
+public class TomcatBayeux implements Bayeux {
+
+
+ protected int reconnectInterval = 5000;
+ /**
+ * a list of all active clients
+ */
+ protected HashMap<String,Client> clients = new HashMap<String,Client>();
+
+ /**
+ * a list of all active channels
+ */
+ protected LinkedHashMap<String, Channel> channels = new LinkedHashMap<String,Channel>();
+
+ /**
+ * security policy to be used.
+ */
+ protected SecurityPolicy securityPolicy = null;
+ /**
+ * default client to use when we need to send an error message but don't have a client valid reference
+ */
+ protected static ClientImpl errorClient = new ClientImpl("error-no-client",false);
+
+ /**
+ * returns the default error client
+ * @return ClientImpl
+ */
+ public static ClientImpl getErrorClient() {
+ return errorClient;
+ }
+
+ protected TomcatBayeux() {
+ }
+
+ /**
+ * should be invoked when the servlet is destroyed or when the context shuts down
+ */
+ public void destroy() {
+ throw new UnsupportedOperationException("TomcatBayeux.destroy() not yet implemented");
+ }
+
+ public Channel getChannel(String channelId, boolean create) {
+ Channel result = channels.get(channelId);
+ if (result==null && create) {
+ result = new ChannelImpl(channelId);
+ channels.put(channelId,result);
+ }
+ return result;
+ }
+
+ public Channel remove(Channel channel) {
+ return channels.remove(channel.getId());
+ }
+
+ public Client remove(Client client) {
+ if (client==null) return null;
+ for (Channel ch : getChannels()) {
+ ch.unsubscribe(client);
+ }
+ return clients.remove(client.getId());
+ }
+
+ public Client getClient(String clientId) {
+ return clients.get(clientId);
+ }
+
+ public boolean hasClient(String clientId) {
+ return clients.containsKey(clientId);
+ }
+
+ public List<Client> getClients() {
+ return java.util.Arrays.asList(clients.entrySet().toArray(new Client[0]));
+ }
+
+ public SecurityPolicy getSecurityPolicy() {
+ return securityPolicy;
+ }
+
+ public int getReconnectInterval() {
+ return reconnectInterval;
+ }
+
+ public boolean hasChannel(String channel) {
+ return channels.containsKey(channel);
+ }
+
+ public Client newClient(String idprefix, Listener listener, boolean local, HttpEvent event) {
+ String id = createUUID(idprefix);
+ ClientImpl client = new ClientImpl(id, local);
+ client.setListener(listener);
+ clients.put(id, client);
+ return client;
+ }
+
+ public Client newClient(String idprefix, Listener listener) {
+ assert listener!=null;
+ //if this method gets called, someone is using the API inside
+ //the JVM, this is a local client
+ return newClient(idprefix,listener,true, null);
+ }
+
+ protected ClientImpl getClientImpl(HttpEvent event) {
+ return (ClientImpl)event.getHttpServletRequest().getAttribute(ClientImpl.COMET_EVENT_ATTR);
+ }
+
+ protected void remove(HttpEvent event) {
+ ClientImpl client = getClientImpl(event);
+ if (client!=null) {
+ client.removeCometEvent(event);
+ }
+ }
+
+ public String createUUID(String idprefix) {
+ if (idprefix==null) idprefix="";
+ return idprefix + Arrays.toString(UUIDGenerator.randomUUID(false));
+ }
+
+ public List<Channel> getChannels() {
+ return java.util.Arrays.asList(channels.entrySet().toArray(new Channel[0]));
+ }
+
+ protected Message newMessage() {
+ String id = createUUID("msg-");
+ return new MessageImpl(id);
+ }
+
+ public Message newMessage(Client from) {
+ MessageImpl msg = (MessageImpl)newMessage();
+ msg.setClient(from);
+ return msg;
+ }
+ public void setSecurityPolicy(SecurityPolicy securityPolicy) {
+ this.securityPolicy = securityPolicy;
+ }
+
+ public void setReconnectInterval(int reconnectTimeout) {
+ this.reconnectInterval = reconnectTimeout;
+ }
+
+}
Added: trunk/java/org/apache/tomcat/bayeux/UUIDGenerator.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/UUIDGenerator.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/UUIDGenerator.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,76 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux;
+
+import java.security.SecureRandom;
+import java.util.Random;
+
+/**
+ * simple generation of a UUID
+ * @author Filip Hanik
+ * @version 1.0
+ */
+public class UUIDGenerator {
+ public static final int UUID_LENGTH = 16;
+ public static final int UUID_VERSION = 4;
+ public static final int BYTES_PER_INT = 4;
+ public static final int BITS_PER_BYTE = 8;
+
+ protected static SecureRandom secrand = null;
+ protected static Random rand = new Random(System.currentTimeMillis());
+ static {
+ secrand = new SecureRandom();
+ secrand.setSeed(rand.nextLong());
+ }
+
+ public static byte[] randomUUID(boolean secure) {
+ byte[] result = new byte[UUID_LENGTH];
+ return randomUUID(secure,result,0);
+ }
+
+ public static byte[] randomUUID(boolean secure, byte[] into, int offset) {
+ if ( (offset+UUID_LENGTH)>into.length )
+ throw new ArrayIndexOutOfBoundsException("Unable to fit "+UUID_LENGTH+" bytes into the array. length:"+into.length+" required length:"+(offset+UUID_LENGTH));
+ Random r = (secure&&(secrand!=null))?secrand:rand;
+ nextBytes(into,offset,UUID_LENGTH,r);
+ into[6+offset] &= 0x0F;
+ into[6+offset] |= (UUID_VERSION << 4);
+ into[8+offset] &= 0x3F; //0011 1111
+ into[8+offset] |= 0x80; //1000 0000
+ return into;
+ }
+
+ /**
+ * Same as java.util.Random.nextBytes except this one we dont have to allocate a new byte array
+ * @param into byte[]
+ * @param offset int
+ * @param length int
+ * @param r Random
+ */
+ public static void nextBytes(byte[] into, int offset, int length, Random r) {
+ int numRequested = length;
+ int numGot = 0, rnd = 0;
+ while (true) {
+ for (int i = 0; i < BYTES_PER_INT; i++) {
+ if (numGot == numRequested) return;
+ rnd = (i == 0 ? r.nextInt() : rnd >> BITS_PER_BYTE);
+ into[offset+numGot] = (byte) rnd;
+ numGot++;
+ }
+ }
+ }
+
+}
Added: trunk/java/org/apache/tomcat/bayeux/request/MetaConnectRequest.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/request/MetaConnectRequest.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/request/MetaConnectRequest.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux.request;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import javax.servlet.ServletException;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.tomcat.bayeux.BayeuxException;
+import org.apache.tomcat.bayeux.BayeuxRequest;
+import org.apache.tomcat.bayeux.ClientImpl;
+import org.apache.tomcat.bayeux.HttpError;
+import org.apache.tomcat.bayeux.RequestBase;
+import org.apache.tomcat.bayeux.TomcatBayeux;
+import org.apache.tomcat.util.json.JSONException;
+import org.apache.tomcat.util.json.JSONObject;
+import org.jboss.servlet.http.HttpEvent;
+
+/******************************************************************************
+ * Handshake request Bayeux message.
+ *
+ * @author Guy A. Molinari
+ * @author Filip Hanik
+ * @version 1.0
+ *
+ */
+public class MetaConnectRequest extends RequestBase implements BayeuxRequest {
+ protected static HashMap<String,Object> responseTemplate = new HashMap<String,Object>();
+
+ static {
+ responseTemplate.put(Bayeux.CHANNEL_FIELD,Bayeux.META_CONNECT);
+ responseTemplate.put(Bayeux.SUCCESSFUL_FIELD,Boolean.TRUE);
+ responseTemplate.put(Bayeux.ADVICE_FIELD, new HashMap<String, Object>());
+ }
+
+ public MetaConnectRequest(TomcatBayeux tb, HttpEvent event, JSONObject jsReq) throws JSONException {
+ super(tb, event, jsReq);
+ if (clientId!=null && getTomcatBayeux().hasClient(clientId)) {
+ event.getHttpServletRequest().setAttribute("client",getTomcatBayeux().getClient(clientId));
+ }
+ }
+
+
+ /**
+ * Check client request for validity.
+ *
+ * Per section 4.2.1 of the Bayuex spec a connect request must contain:
+ * 1) The "/meta/connect" channel identifier.
+ * 2) The clientId returned by the server after handshake.
+ * 3) The desired connectionType (must be one of the server's supported
+ * types returned by handshake response.
+ *
+ * @return HttpError This method returns null if no errors were found
+ */
+ public HttpError validate() {
+ if(clientId==null|| (!getTomcatBayeux().hasClient(clientId)))
+ return new HttpError(400,"Client Id not valid.", null);
+ if (! (Bayeux.TRANSPORT_LONG_POLL.equals(conType) || Bayeux.TRANSPORT_CALLBACK_POLL.equals(conType)))
+ return new HttpError(400,"Unsupported connection type.",null);
+ return null;//no error
+ }
+
+ /**
+ * Transition to connected state, flushing pending messages if
+ * available. If there are pending subscriptions and no messages to
+ * flush then the connection is held until there is a pending publish
+ * event to be delivered to this client (Section 4.2.2 of spec).
+ */
+ public int process(int prevops) throws BayeuxException {
+ prevops = super.process(prevops);
+ response = (HashMap<String, Object>)responseTemplate.clone();
+ ClientImpl client = (ClientImpl)getTomcatBayeux().getClient(clientId);
+ boolean success = false;
+ HttpError error = validate();
+ if (error == null) {
+ client.setDesirectConnType(desiredConnTypeFlag);
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put(Bayeux.RECONNECT_FIELD, Bayeux.RETRY_RESPONSE);
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put(Bayeux.INTERVAL_FIELD, getReconnectInterval());
+ success = true;
+ }else {
+ response.put(Bayeux.SUCCESSFUL_FIELD,Boolean.FALSE);
+ response.put(Bayeux.ERROR_FIELD, error.toString());
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put(Bayeux.RECONNECT_FIELD, Bayeux.HANDSHAKE_RESPONSE);
+ if (client==null) client = TomcatBayeux.getErrorClient();
+ }
+ response.put(Bayeux.CLIENT_FIELD, client.getId());
+ response.put(Bayeux.TIMESTAMP_FIELD,getTimeStamp());
+ try {
+ JSONObject obj = new JSONObject(response);
+ addToDeliveryQueue(client, obj);
+ } catch (ServletException x) {
+ throw new BayeuxException(x);
+ } catch (IOException x) {
+ throw new BayeuxException(x);
+ }
+
+ //return immediately if there is no subscriptions
+ //so that we can process the next message
+ int result = client.isSubscribed()?1:0;
+
+ if (success && client!=null && client.hasMessages()) {
+ //send out messages
+ flushMessages(client);
+ result = 0; //flush out the messages
+ }
+
+ return result;
+ }
+}
+
Added: trunk/java/org/apache/tomcat/bayeux/request/MetaDisconnectRequest.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/request/MetaDisconnectRequest.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/request/MetaDisconnectRequest.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux.request;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import javax.servlet.ServletException;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.tomcat.bayeux.BayeuxException;
+import org.apache.tomcat.bayeux.BayeuxRequest;
+import org.apache.tomcat.bayeux.ClientImpl;
+import org.apache.tomcat.bayeux.HttpError;
+import org.apache.tomcat.bayeux.RequestBase;
+import org.apache.tomcat.bayeux.TomcatBayeux;
+import org.apache.tomcat.util.json.JSONException;
+import org.apache.tomcat.util.json.JSONObject;
+import org.jboss.servlet.http.HttpEvent;
+
+/******************************************************************************
+ * Handshake request Bayeux message.
+ *
+ * @author Guy A. Molinari
+ * @author Filip Hanik
+ * @version 1.0
+ *
+ */
+public class MetaDisconnectRequest extends RequestBase implements BayeuxRequest {
+
+ protected static HashMap<String,Object> responseTemplate = new HashMap<String,Object>();
+
+ static {
+ responseTemplate.put(Bayeux.CHANNEL_FIELD,Bayeux.META_DISCONNECT);
+ responseTemplate.put(Bayeux.SUCCESSFUL_FIELD,Boolean.TRUE);
+ responseTemplate.put(Bayeux.ADVICE_FIELD, new HashMap<String, Object>());
+ }
+
+ public MetaDisconnectRequest(TomcatBayeux tb, HttpEvent event, JSONObject jsReq) throws JSONException {
+ super(tb, event, jsReq);
+ }
+
+
+ /**
+ * Check client request for validity.
+ *
+ * Per section 4.4.1 of the Bayuex spec a connect request must contain:
+ * 1) The "/meta/disconnect" channel identifier.
+ * 2) The clientId.
+ *
+ * @return HttpError This method returns null if no errors were found
+ */
+ public HttpError validate() {
+ if(clientId==null|| (!this.getTomcatBayeux().hasClient(clientId)))
+ return new HttpError(400,"Client Id not valid.", null);
+// if (! (Bayeux.TRANSPORT_LONG_POLL.equals(conType) || Bayeux.TRANSPORT_CALLBACK_POLL.equals(conType)))
+// return new HttpError(400,"Unsupported connection type.",null);
+ return null;//no error
+ }
+
+ /**
+ * Disconnect a client session.
+ */
+ public int process(int prevops) throws BayeuxException {
+ prevops = super.process(prevops);
+ response = (HashMap<String, Object>)responseTemplate.clone();
+ ClientImpl client = (ClientImpl)getTomcatBayeux().getClient(clientId);
+ HttpError error = validate();
+ if (error == null) {
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put("reconnect", "retry");
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put("interval", getReconnectInterval());
+ }else {
+ getTomcatBayeux().remove(client);
+ response.put(Bayeux.SUCCESSFUL_FIELD,Boolean.FALSE);
+ response.put(Bayeux.ERROR_FIELD, error.toString());
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put("reconnect", "none");
+ if (client==null) client = TomcatBayeux.getErrorClient();
+ }
+ response.put(Bayeux.CLIENT_FIELD, client.getId());
+ try {
+ JSONObject obj = new JSONObject(response);
+ addToDeliveryQueue(client, obj);
+ } catch (ServletException x) {
+ throw new BayeuxException(x);
+ } catch (IOException x) {
+ throw new BayeuxException(x);
+ }
+ return 0;
+ }
+}
+
Added: trunk/java/org/apache/tomcat/bayeux/request/MetaHandshakeRequest.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/request/MetaHandshakeRequest.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/request/MetaHandshakeRequest.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux.request;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import javax.servlet.ServletException;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.tomcat.bayeux.BayeuxException;
+import org.apache.tomcat.bayeux.BayeuxRequest;
+import org.apache.tomcat.bayeux.ClientImpl;
+import org.apache.tomcat.bayeux.HttpError;
+import org.apache.tomcat.bayeux.RequestBase;
+import org.apache.tomcat.bayeux.TomcatBayeux;
+import org.apache.tomcat.util.json.JSONException;
+import org.apache.tomcat.util.json.JSONObject;
+import org.jboss.servlet.http.HttpEvent;
+
+/******************************************************************************
+ * Handshake request Bayeux message.
+ *
+ * @author Guy A. Molinari
+ * @author Filip Hanik
+ * @version 1.0
+ *
+ */
+public class MetaHandshakeRequest extends RequestBase implements BayeuxRequest {
+
+ protected static HashMap<String,Object> responseTemplate = new HashMap<String,Object>();
+
+ static {
+ responseTemplate.put(Bayeux.CHANNEL_FIELD,Bayeux.META_HANDSHAKE);
+ responseTemplate.put(Bayeux.VERSION_FIELD,"1.0");
+ responseTemplate.put(Bayeux.SUPP_CONNECTION_TYPE_FIELD,new String[] { Bayeux.TRANSPORT_LONG_POLL, Bayeux.TRANSPORT_CALLBACK_POLL });
+ responseTemplate.put(Bayeux.SUCCESSFUL_FIELD,Boolean.TRUE);
+ responseTemplate.put(Bayeux.ADVICE_FIELD, new HashMap<String, Object>());
+ }
+
+ public MetaHandshakeRequest(TomcatBayeux tomcatBayeux, HttpEvent event, JSONObject jsReq) throws JSONException {
+ super(tomcatBayeux, event, jsReq);
+ }
+
+
+ public String getVersion() { return version; }
+ public String getMinimumVersion() { return minVersion; }
+
+
+ /**
+ * Check client request for validity.
+ *
+ * Per section 4.1.1 of the Bayuex spec a handshake request must contain:
+ * 1) The "/meta/handshake" channel identifier.
+ * 2) The version of the protocol supported by the client
+ * 3) The client's supported connection types.
+ *
+ * @return HttpError This method returns null if no errors were found
+ */
+ public HttpError validate() {
+ boolean error = (version==null || version.length()==0);
+ if (!error) error = suppConnTypesFlag==0;
+ if (error) return new HttpError(400,"Invalid handshake request, supportedConnectionType field missing.",null);
+ else return null;
+ }
+
+ /**
+ * Generate and return a client identifier. Return a list of
+ * supported connection types. Must be a subset of or identical to
+ * the list of types supported by the client. See section 4.1.2 of
+ * the Bayuex specification.
+ */
+ public int process(int prevops) throws BayeuxException {
+ prevops = super.process(prevops);
+ response = (HashMap<String, Object>)responseTemplate.clone();
+ ClientImpl client = null;
+ HttpError error = validate();
+ if (error == null) {
+ client = (ClientImpl) getTomcatBayeux().newClient("http-", null, false,getEvent());
+ clientId = client.getId();
+ client.setSupportedConnTypes(suppConnTypesFlag);
+ client.setUseJsonFiltered(getExt().get(Bayeux.JSON_COMMENT_FILTERED_FIELD) != null);
+ response.put(Bayeux.CLIENT_FIELD, client.getId());
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put(Bayeux.RECONNECT_FIELD, Bayeux.RETRY_RESPONSE);
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put(Bayeux.INTERVAL_FIELD, getReconnectInterval());
+ }else {
+ response.put(Bayeux.SUCCESSFUL_FIELD,Boolean.FALSE);
+ response.put(Bayeux.ERROR_FIELD, error.toString());
+ client = TomcatBayeux.getErrorClient();
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put(Bayeux.RECONNECT_FIELD, Bayeux.NONE_RESPONSE);
+ }
+ try {
+ JSONObject obj = new JSONObject(response);
+ addToDeliveryQueue(client, obj);
+ } catch (ServletException x) {
+ throw new BayeuxException(x);
+ } catch (IOException x) {
+ throw new BayeuxException(x);
+ }
+ return 0;
+ }
+}
+
Added: trunk/java/org/apache/tomcat/bayeux/request/MetaSubscribeRequest.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/request/MetaSubscribeRequest.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/request/MetaSubscribeRequest.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux.request;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.ServletException;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.cometd.bayeux.Channel;
+import org.apache.tomcat.bayeux.BayeuxException;
+import org.apache.tomcat.bayeux.BayeuxRequest;
+import org.apache.tomcat.bayeux.ChannelImpl;
+import org.apache.tomcat.bayeux.ClientImpl;
+import org.apache.tomcat.bayeux.HttpError;
+import org.apache.tomcat.bayeux.RequestBase;
+import org.apache.tomcat.bayeux.TomcatBayeux;
+import org.apache.tomcat.util.json.JSONException;
+import org.apache.tomcat.util.json.JSONObject;
+import org.jboss.servlet.http.HttpEvent;
+
+/******************************************************************************
+ * Handshake request Bayeux message.
+ *
+ * @author Guy A. Molinari
+ * @author Filip Hanik
+ * @version 1.0
+ */
+public class MetaSubscribeRequest extends RequestBase implements BayeuxRequest {
+
+ protected static HashMap<String,Object> responseTemplate = new HashMap<String,Object>();
+
+ static {
+ responseTemplate.put(Bayeux.CHANNEL_FIELD,Bayeux.META_SUBSCRIBE);
+ responseTemplate.put(Bayeux.SUCCESSFUL_FIELD,Boolean.TRUE);
+ responseTemplate.put(Bayeux.ADVICE_FIELD, new HashMap<String, Object>());
+ }
+
+ public MetaSubscribeRequest(TomcatBayeux tb, HttpEvent event, JSONObject jsReq) throws JSONException {
+ super(tb, event, jsReq);
+ }
+
+
+ /**
+ * Check client request for validity.
+ *
+ * Per section 4.5.1 of the Bayuex spec a connect request must contain:
+ * 1) The "/meta/subscribe" channel identifier.
+ * 2) The clientId.
+ * 3) The subscription. This is the name of the channel of interest,
+ * or a pattern.
+ *
+ * @return HttpError This method returns null if no errors were found
+ */
+ public HttpError validate() {
+ if(clientId==null|| (!this.getTomcatBayeux().hasClient(clientId)))
+ return new HttpError(400,"Client Id not valid.", null);
+ if (subscription==null||subscription.length()==0)
+ return new HttpError(400,"Subscription missing.",null);
+ return null;//no error
+ }
+
+ /**
+ * Register interest for one or more channels. Per section 2.2.1 of the
+ * Bayeux spec, a pattern may be specified. Assign client to matching
+ * channels and inverse client to channel reference.
+ */
+ public int process(int prevops) throws BayeuxException {
+ prevops = super.process(prevops);
+ response = (HashMap<String, Object>)this.responseTemplate.clone();
+ ClientImpl client = (ClientImpl)getTomcatBayeux().getClient(clientId);
+ HttpError error = validate();
+ if (error == null) {
+ boolean wildcard = subscription.indexOf('*')!=-1;
+ boolean subscribed = false;
+ if (wildcard) {
+ List<Channel> channels = getTomcatBayeux().getChannels();
+ Iterator<Channel> it = channels.iterator();
+ while (it.hasNext()) {
+ ChannelImpl ch = (ChannelImpl)it.next();
+ if (ch.matches(subscription)) {
+ ch.subscribe(client);
+ subscribed = true;
+ }
+ }
+ }else {
+ ChannelImpl ch = (ChannelImpl)getTomcatBayeux().getChannel(subscription,true);
+ ch.subscribe(client);
+ subscribed = true;
+ }
+ response.put(Bayeux.SUCCESSFUL_FIELD, Boolean.valueOf(subscribed));
+ response.put(Bayeux.SUBSCRIPTION_FIELD,subscription);
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put("reconnect", "retry");
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put("interval", getReconnectInterval());
+ }else {
+ response.put(Bayeux.SUCCESSFUL_FIELD,Boolean.FALSE);
+ response.put(Bayeux.ERROR_FIELD, error.toString());
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put("reconnect", "handshake");
+ if (client==null) client = TomcatBayeux.getErrorClient();
+ }
+ response.put(Bayeux.CLIENT_FIELD, client.getId());
+ response.put(Bayeux.TIMESTAMP_FIELD,getTimeStamp());
+ try {
+ JSONObject obj = new JSONObject(response);
+ addToDeliveryQueue(client, obj);
+ } catch (ServletException x) {
+ throw new BayeuxException(x);
+ } catch (IOException x) {
+ throw new BayeuxException(x);
+ }
+ return 0;
+ }
+}
+
Added: trunk/java/org/apache/tomcat/bayeux/request/MetaUnsubscribeRequest.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/request/MetaUnsubscribeRequest.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/request/MetaUnsubscribeRequest.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux.request;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.ServletException;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.cometd.bayeux.Channel;
+import org.apache.tomcat.bayeux.BayeuxException;
+import org.apache.tomcat.bayeux.BayeuxRequest;
+import org.apache.tomcat.bayeux.ChannelImpl;
+import org.apache.tomcat.bayeux.ClientImpl;
+import org.apache.tomcat.bayeux.HttpError;
+import org.apache.tomcat.bayeux.RequestBase;
+import org.apache.tomcat.bayeux.TomcatBayeux;
+import org.apache.tomcat.util.json.JSONException;
+import org.apache.tomcat.util.json.JSONObject;
+import org.jboss.servlet.http.HttpEvent;
+
+/******************************************************************************
+ * Handshake request Bayeux message.
+ *
+ * @author Guy A. Molinari
+ * @author Filip Hanik
+ * @version 1.0
+ *
+ */
+public class MetaUnsubscribeRequest extends RequestBase implements BayeuxRequest {
+
+ protected static HashMap<String,Object> responseTemplate = new HashMap<String,Object>();
+
+ static {
+ responseTemplate.put(Bayeux.CHANNEL_FIELD,Bayeux.META_UNSUBSCRIBE);
+ responseTemplate.put(Bayeux.SUCCESSFUL_FIELD,Boolean.TRUE);
+ responseTemplate.put(Bayeux.ADVICE_FIELD, new HashMap<String, Object>());
+ }
+
+ public MetaUnsubscribeRequest(TomcatBayeux tb, HttpEvent event, JSONObject jsReq) throws JSONException {
+ super(tb, event, jsReq);
+ }
+
+
+ /**
+ * Check client request for validity.
+ *
+ * Per section 4.6.1 of the Bayuex spec a connect request must contain:
+ * 1) The "/meta/unsubscribe" channel identifier.
+ * 2) The clientId.
+ * 3) The subscription. This is the name of the channel of interest,
+ * or a pattern.
+ *
+ * @return HttpError This method returns null if no errors were found
+ */
+ public HttpError validate() {
+ if(clientId==null|| (!this.getTomcatBayeux().hasClient(clientId)))
+ return new HttpError(400,"Client Id not valid.", null);
+ if (subscription==null||subscription.length()==0)
+ return new HttpError(400,"Subscription missing.",null);
+ return null;//no error
+ }
+
+ /**
+ * De-register interest for one or more channels. Per section 2.2.1 of the
+ * Bayeux spec, a pattern may be specified. Sever relationships.
+ */
+ public int process(int prevops) throws BayeuxException {
+ prevops = super.process(prevops);
+ response = (HashMap<String, Object>)responseTemplate.clone();
+ ClientImpl client = (ClientImpl)getTomcatBayeux().getClient(clientId);
+ HttpError error = validate();
+ if (error == null) {
+ boolean wildcard = subscription.indexOf('*')!=-1;
+ boolean unsubscribed = false;
+ if (wildcard) {
+ List<Channel> channels = getTomcatBayeux().getChannels();
+ Iterator<Channel> it = channels.iterator();
+ while (it.hasNext()) {
+ ChannelImpl ch = (ChannelImpl)it.next();
+ if (ch.matches(subscription)) {
+ ch.unsubscribe(client);
+ unsubscribed = true;
+ }
+ }
+ }else {
+ ChannelImpl ch = (ChannelImpl)getTomcatBayeux().getChannel(subscription,true);
+ ch.unsubscribe(client);
+ unsubscribed = true;
+ }
+ response.put(Bayeux.SUCCESSFUL_FIELD, Boolean.valueOf(unsubscribed));
+ response.put(Bayeux.SUBSCRIPTION_FIELD,subscription);
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put("reconnect", "retry");
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put("interval", getReconnectInterval());
+ }else {
+ response.put(Bayeux.SUCCESSFUL_FIELD,Boolean.FALSE);
+ response.put(Bayeux.ERROR_FIELD, error.toString());
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put("reconnect", "handshake");
+ if (client==null) client = TomcatBayeux.getErrorClient();
+ }
+ response.put(Bayeux.CLIENT_FIELD, client.getId());
+ response.put(Bayeux.TIMESTAMP_FIELD,getTimeStamp());
+ try {
+ JSONObject obj = new JSONObject(response);
+ addToDeliveryQueue(client, obj);
+ } catch (ServletException x) {
+ throw new BayeuxException(x);
+ } catch (IOException x) {
+ throw new BayeuxException(x);
+ }
+ return 0;
+ }
+}
+
Added: trunk/java/org/apache/tomcat/bayeux/request/PublishRequest.java
===================================================================
--- trunk/java/org/apache/tomcat/bayeux/request/PublishRequest.java (rev 0)
+++ trunk/java/org/apache/tomcat/bayeux/request/PublishRequest.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.bayeux.request;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import javax.servlet.ServletException;
+
+import org.apache.cometd.bayeux.Bayeux;
+import org.apache.tomcat.bayeux.BayeuxException;
+import org.apache.tomcat.bayeux.BayeuxRequest;
+import org.apache.tomcat.bayeux.ChannelImpl;
+import org.apache.tomcat.bayeux.ClientImpl;
+import org.apache.tomcat.bayeux.HttpError;
+import org.apache.tomcat.bayeux.MessageImpl;
+import org.apache.tomcat.bayeux.RequestBase;
+import org.apache.tomcat.bayeux.TomcatBayeux;
+import org.apache.tomcat.util.json.JSONException;
+import org.apache.tomcat.util.json.JSONObject;
+import org.jboss.servlet.http.HttpEvent;
+
+/******************************************************************************
+ * Handshake request Bayeux message.
+ *
+ * @author Guy A. Molinari
+ * @author Filip Hanik
+ * @version 1.0
+ *
+ */
+public class PublishRequest extends RequestBase implements BayeuxRequest {
+
+ JSONObject msgData = null;
+
+ protected static HashMap<String,Object> responseTemplate = new HashMap<String,Object>();
+
+ static {
+ responseTemplate.put(Bayeux.SUCCESSFUL_FIELD,Boolean.TRUE);
+ responseTemplate.put(Bayeux.ADVICE_FIELD, new HashMap<String, Object>());
+ }
+
+ public PublishRequest(TomcatBayeux tb, HttpEvent event, JSONObject jsReq) throws JSONException {
+ super(tb, event, jsReq);
+ }
+
+
+ /**
+ * Check client request for validity.
+ *
+ * Per section 5.1.1 of the Bayuex spec a connect request must contain:
+ * 1) The channel identifier of the channel for publication.
+ * 2) The data to send.
+ *
+ * @return HttpError This method returns null if no errors were found
+ */
+ public HttpError validate() {
+ if(channel==null|| (!this.getTomcatBayeux().hasChannel(channel)))
+ return new HttpError(400,"Channel Id not valid.", null);
+ if(data==null || data.length()==0)
+ return new HttpError(400,"Message data missing.", null);
+ try {
+ this.msgData = new JSONObject(data);
+ }catch (JSONException x) {
+ return new HttpError(400,"Invalid JSON object in data attribute.",x);
+ }
+ if(clientId==null|| (!this.getTomcatBayeux().hasClient(clientId)))
+ return new HttpError(400,"Client Id not valid.", null);
+ return null;//no error
+ }
+
+ /**
+ * Send the event message to all registered subscribers.
+ */
+ public int process(int prevops) throws BayeuxException {
+ prevops = super.process(prevops);
+ response = (HashMap<String, Object>)responseTemplate.clone();
+ ClientImpl client = clientId!=null?(ClientImpl)getTomcatBayeux().getClient(clientId):
+ (ClientImpl)event.getHttpServletRequest().getAttribute("client");
+ boolean success = false;
+ HttpError error = validate();
+ if (error == null) {
+ ChannelImpl chimpl = (ChannelImpl)getTomcatBayeux().getChannel(channel,false);
+ MessageImpl mimpl = (MessageImpl)getTomcatBayeux().newMessage(client);
+
+ try {
+ String[] keys = JSONObject.getNames(msgData);
+ for (int i = 0; i < keys.length; i++) {
+ mimpl.put(keys[i], msgData.get(keys[i]));
+ }
+ success = true;
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put(Bayeux.RECONNECT_FIELD, Bayeux.RETRY_RESPONSE);
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put(Bayeux.INTERVAL_FIELD, getReconnectInterval());
+ }catch (JSONException x) {
+ throw new BayeuxException(x);
+ }
+ chimpl.publish(mimpl);
+ }
+ if(!success) {
+ response.put(Bayeux.SUCCESSFUL_FIELD,Boolean.FALSE);
+ response.put(Bayeux.ERROR_FIELD, error.toString());
+ ((HashMap) response.get(Bayeux.ADVICE_FIELD)).put(Bayeux.RECONNECT_FIELD, Bayeux.HANDSHAKE_RESPONSE);
+ if (client==null) client = TomcatBayeux.getErrorClient();
+ }
+ response.put(Bayeux.CHANNEL_FIELD,channel);
+ response.put(Bayeux.CLIENT_FIELD, client.getId());
+ try {
+ JSONObject obj = new JSONObject(response);
+ addToDeliveryQueue(client, obj);
+ } catch (ServletException x) {
+ throw new BayeuxException(x);
+ } catch (IOException x) {
+ throw new BayeuxException(x);
+ }
+
+ if (success && client!=null && client.hasMessages()) {
+ //send out messages
+ flushMessages(client);
+ }
+
+ return 0;
+ }
+}
+
Added: trunk/java/org/apache/tomcat/util/json/JSONArray.java
===================================================================
--- trunk/java/org/apache/tomcat/util/json/JSONArray.java (rev 0)
+++ trunk/java/org/apache/tomcat/util/json/JSONArray.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,936 @@
+package org.apache.tomcat.util.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+import java.io.IOException;
+import java.io.Writer;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * A JSONArray is an ordered sequence of values. Its external text form is a
+ * string wrapped in square brackets with commas separating the values. The
+ * internal form is an object having <code>get</code> and <code>opt</code>
+ * methods for accessing the values by index, and <code>put</code> methods for
+ * adding or replacing values. The values can be any of these types:
+ * <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>,
+ * <code>Number</code>, <code>String</code>, or the
+ * <code>JSONObject.NULL object</code>.
+ * <p>
+ * The constructor can convert a JSON text into a Java object. The
+ * <code>toString</code> method converts to JSON text.
+ * <p>
+ * A <code>get</code> method returns a value if one can be found, and throws an
+ * exception if one cannot be found. An <code>opt</code> method returns a
+ * default value instead of throwing an exception, and so is useful for
+ * obtaining optional values.
+ * <p>
+ * The generic <code>get()</code> and <code>opt()</code> methods return an
+ * object which you can cast or query for type. There are also typed
+ * <code>get</code> and <code>opt</code> methods that do type checking and type
+ * coersion for you.
+ * <p>
+ * The texts produced by the <code>toString</code> methods strictly conform to
+ * JSON syntax rules. The constructors are more forgiving in the texts they will
+ * accept:
+ * <ul>
+ * <li>An extra <code>,</code> <small>(comma)</small> may appear just
+ * before the closing bracket.</li>
+ * <li>The <code>null</code> value will be inserted when there
+ * is <code>,</code> <small>(comma)</small> elision.</li>
+ * <li>Strings may be quoted with <code>'</code> <small>(single
+ * quote)</small>.</li>
+ * <li>Strings do not need to be quoted at all if they do not begin with a quote
+ * or single quote, and if they do not contain leading or trailing spaces,
+ * and if they do not contain any of these characters:
+ * <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
+ * and if they are not the reserved words <code>true</code>,
+ * <code>false</code>, or <code>null</code>.</li>
+ * <li>Values can be separated by <code>;</code> <small>(semicolon)</small> as
+ * well as by <code>,</code> <small>(comma)</small>.</li>
+ * <li>Numbers may have the <code>0-</code> <small>(octal)</small> or
+ * <code>0x-</code> <small>(hex)</small> prefix.</li>
+ * <li>Comments written in the slashshlash, slashstar, and hash conventions
+ * will be ignored.</li>
+ * </ul>
+
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONArray {
+
+
+ /**
+ * The arrayList where the JSONArray's properties are kept.
+ */
+ private ArrayList myArrayList;
+
+
+ /**
+ * Construct an empty JSONArray.
+ */
+ public JSONArray() {
+ this.myArrayList = new ArrayList();
+ }
+
+ /**
+ * Construct a JSONArray from a JSONTokener.
+ * @param x A JSONTokener
+ * @throws JSONException If there is a syntax error.
+ */
+ public JSONArray(JSONTokener x) throws JSONException {
+ this();
+ char c = x.nextClean();
+ char q;
+ if (c == '[') {
+ q = ']';
+ } else if (c == '(') {
+ q = ')';
+ } else {
+ throw x.syntaxError("A JSONArray text must start with '['");
+ }
+ if (x.nextClean() == ']') {
+ return;
+ }
+ x.back();
+ for (;;) {
+ if (x.nextClean() == ',') {
+ x.back();
+ this.myArrayList.add(null);
+ } else {
+ x.back();
+ this.myArrayList.add(x.nextValue());
+ }
+ c = x.nextClean();
+ switch (c) {
+ case ';':
+ case ',':
+ if (x.nextClean() == ']') {
+ return;
+ }
+ x.back();
+ break;
+ case ']':
+ case ')':
+ if (q != c) {
+ throw x.syntaxError("Expected a '" + new Character(q) + "'");
+ }
+ return;
+ default:
+ throw x.syntaxError("Expected a ',' or ']'");
+ }
+ }
+ }
+
+
+ /**
+ * Construct a JSONArray from a source JSON text.
+ * @param source A string that begins with
+ * <code>[</code> <small>(left bracket)</small>
+ * and ends with <code>]</code> <small>(right bracket)</small>.
+ * @throws JSONException If there is a syntax error.
+ */
+ public JSONArray(String source) throws JSONException {
+ this(new JSONTokener(source));
+ }
+
+
+ /**
+ * Construct a JSONArray from a Collection.
+ * @param collection A Collection.
+ */
+ public JSONArray(Collection collection) {
+ this.myArrayList = (collection == null) ?
+ new ArrayList() :
+ new ArrayList(collection);
+ }
+
+ /**
+ * Construct a JSONArray from a collection of beans.
+ * The collection should have Java Beans.
+ *
+ * @throws JSONException If not an array.
+ */
+
+ public JSONArray(Collection collection,boolean includeSuperClass) {
+ this.myArrayList = new ArrayList();
+ if(collection != null) {
+ for (Iterator iter = collection.iterator(); iter.hasNext();) {
+ this.myArrayList.add(new JSONObject(iter.next(),includeSuperClass));
+ }
+ }
+ }
+
+
+ /**
+ * Construct a JSONArray from an array
+ * @throws JSONException If not an array.
+ */
+ public JSONArray(Object array) throws JSONException {
+ this();
+ if (array.getClass().isArray()) {
+ int length = Array.getLength(array);
+ for (int i = 0; i < length; i += 1) {
+ this.put(Array.get(array, i));
+ }
+ } else {
+ throw new JSONException("JSONArray initial value should be a string or collection or array.");
+ }
+ }
+
+ /**
+ * Construct a JSONArray from an array with a bean.
+ * The array should have Java Beans.
+ *
+ * @throws JSONException If not an array.
+ */
+ public JSONArray(Object array,boolean includeSuperClass) throws JSONException {
+ this();
+ if (array.getClass().isArray()) {
+ int length = Array.getLength(array);
+ for (int i = 0; i < length; i += 1) {
+ this.put(new JSONObject(Array.get(array, i),includeSuperClass));
+ }
+ } else {
+ throw new JSONException("JSONArray initial value should be a string or collection or array.");
+ }
+ }
+
+
+
+ /**
+ * Get the object value associated with an index.
+ * @param index
+ * The index must be between 0 and length() - 1.
+ * @return An object value.
+ * @throws JSONException If there is no value for the index.
+ */
+ public Object get(int index) throws JSONException {
+ Object o = opt(index);
+ if (o == null) {
+ throw new JSONException("JSONArray[" + index + "] not found.");
+ }
+ return o;
+ }
+
+
+ /**
+ * Get the boolean value associated with an index.
+ * The string values "true" and "false" are converted to boolean.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The truth.
+ * @throws JSONException If there is no value for the index or if the
+ * value is not convertable to boolean.
+ */
+ public boolean getBoolean(int index) throws JSONException {
+ Object o = get(index);
+ if (o.equals(Boolean.FALSE) ||
+ (o instanceof String &&
+ ((String)o).equalsIgnoreCase("false"))) {
+ return false;
+ } else if (o.equals(Boolean.TRUE) ||
+ (o instanceof String &&
+ ((String)o).equalsIgnoreCase("true"))) {
+ return true;
+ }
+ throw new JSONException("JSONArray[" + index + "] is not a Boolean.");
+ }
+
+
+ /**
+ * Get the double value associated with an index.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ * @throws JSONException If the key is not found or if the value cannot
+ * be converted to a number.
+ */
+ public double getDouble(int index) throws JSONException {
+ Object o = get(index);
+ try {
+ return o instanceof Number ?
+ ((Number)o).doubleValue() :
+ Double.valueOf((String)o).doubleValue();
+ } catch (Exception e) {
+ throw new JSONException("JSONArray[" + index +
+ "] is not a number.");
+ }
+ }
+
+
+ /**
+ * Get the int value associated with an index.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ * @throws JSONException If the key is not found or if the value cannot
+ * be converted to a number.
+ * if the value cannot be converted to a number.
+ */
+ public int getInt(int index) throws JSONException {
+ Object o = get(index);
+ return o instanceof Number ?
+ ((Number)o).intValue() : (int)getDouble(index);
+ }
+
+
+ /**
+ * Get the JSONArray associated with an index.
+ * @param index The index must be between 0 and length() - 1.
+ * @return A JSONArray value.
+ * @throws JSONException If there is no value for the index. or if the
+ * value is not a JSONArray
+ */
+ public JSONArray getJSONArray(int index) throws JSONException {
+ Object o = get(index);
+ if (o instanceof JSONArray) {
+ return (JSONArray)o;
+ }
+ throw new JSONException("JSONArray[" + index +
+ "] is not a JSONArray.");
+ }
+
+
+ /**
+ * Get the JSONObject associated with an index.
+ * @param index subscript
+ * @return A JSONObject value.
+ * @throws JSONException If there is no value for the index or if the
+ * value is not a JSONObject
+ */
+ public JSONObject getJSONObject(int index) throws JSONException {
+ Object o = get(index);
+ if (o instanceof JSONObject) {
+ return (JSONObject)o;
+ }
+ throw new JSONException("JSONArray[" + index +
+ "] is not a JSONObject.");
+ }
+
+
+ /**
+ * Get the long value associated with an index.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ * @throws JSONException If the key is not found or if the value cannot
+ * be converted to a number.
+ */
+ public long getLong(int index) throws JSONException {
+ Object o = get(index);
+ return o instanceof Number ?
+ ((Number)o).longValue() : (long)getDouble(index);
+ }
+
+
+ /**
+ * Get the string associated with an index.
+ * @param index The index must be between 0 and length() - 1.
+ * @return A string value.
+ * @throws JSONException If there is no value for the index.
+ */
+ public String getString(int index) throws JSONException {
+ return get(index).toString();
+ }
+
+
+ /**
+ * Determine if the value is null.
+ * @param index The index must be between 0 and length() - 1.
+ * @return true if the value at the index is null, or if there is no value.
+ */
+ public boolean isNull(int index) {
+ return JSONObject.NULL.equals(opt(index));
+ }
+
+
+ /**
+ * Make a string from the contents of this JSONArray. The
+ * <code>separator</code> string is inserted between each element.
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param separator A string that will be inserted between the elements.
+ * @return a string.
+ * @throws JSONException If the array contains an invalid number.
+ */
+ public String join(String separator) throws JSONException {
+ int len = length();
+ StringBuffer sb = new StringBuffer();
+
+ for (int i = 0; i < len; i += 1) {
+ if (i > 0) {
+ sb.append(separator);
+ }
+ sb.append(JSONObject.valueToString(this.myArrayList.get(i)));
+ }
+ return sb.toString();
+ }
+
+
+ /**
+ * Get the number of elements in the JSONArray, included nulls.
+ *
+ * @return The length (or size).
+ */
+ public int length() {
+ return this.myArrayList.size();
+ }
+
+
+ /**
+ * Get the optional object value associated with an index.
+ * @param index The index must be between 0 and length() - 1.
+ * @return An object value, or null if there is no
+ * object at that index.
+ */
+ public Object opt(int index) {
+ return (index < 0 || index >= length()) ?
+ null : this.myArrayList.get(index);
+ }
+
+
+ /**
+ * Get the optional boolean value associated with an index.
+ * It returns false if there is no value at that index,
+ * or if the value is not Boolean.TRUE or the String "true".
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The truth.
+ */
+ public boolean optBoolean(int index) {
+ return optBoolean(index, false);
+ }
+
+
+ /**
+ * Get the optional boolean value associated with an index.
+ * It returns the defaultValue if there is no value at that index or if
+ * it is not a Boolean or the String "true" or "false" (case insensitive).
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @param defaultValue A boolean default.
+ * @return The truth.
+ */
+ public boolean optBoolean(int index, boolean defaultValue) {
+ try {
+ return getBoolean(index);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get the optional double value associated with an index.
+ * NaN is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ */
+ public double optDouble(int index) {
+ return optDouble(index, Double.NaN);
+ }
+
+
+ /**
+ * Get the optional double value associated with an index.
+ * The defaultValue is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ *
+ * @param index subscript
+ * @param defaultValue The default value.
+ * @return The value.
+ */
+ public double optDouble(int index, double defaultValue) {
+ try {
+ return getDouble(index);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get the optional int value associated with an index.
+ * Zero is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ */
+ public int optInt(int index) {
+ return optInt(index, 0);
+ }
+
+
+ /**
+ * Get the optional int value associated with an index.
+ * The defaultValue is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ * @param index The index must be between 0 and length() - 1.
+ * @param defaultValue The default value.
+ * @return The value.
+ */
+ public int optInt(int index, int defaultValue) {
+ try {
+ return getInt(index);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get the optional JSONArray associated with an index.
+ * @param index subscript
+ * @return A JSONArray value, or null if the index has no value,
+ * or if the value is not a JSONArray.
+ */
+ public JSONArray optJSONArray(int index) {
+ Object o = opt(index);
+ return o instanceof JSONArray ? (JSONArray)o : null;
+ }
+
+
+ /**
+ * Get the optional JSONObject associated with an index.
+ * Null is returned if the key is not found, or null if the index has
+ * no value, or if the value is not a JSONObject.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return A JSONObject value.
+ */
+ public JSONObject optJSONObject(int index) {
+ Object o = opt(index);
+ return o instanceof JSONObject ? (JSONObject)o : null;
+ }
+
+
+ /**
+ * Get the optional long value associated with an index.
+ * Zero is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return The value.
+ */
+ public long optLong(int index) {
+ return optLong(index, 0);
+ }
+
+
+ /**
+ * Get the optional long value associated with an index.
+ * The defaultValue is returned if there is no value for the index,
+ * or if the value is not a number and cannot be converted to a number.
+ * @param index The index must be between 0 and length() - 1.
+ * @param defaultValue The default value.
+ * @return The value.
+ */
+ public long optLong(int index, long defaultValue) {
+ try {
+ return getLong(index);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get the optional string value associated with an index. It returns an
+ * empty string if there is no value at that index. If the value
+ * is not a string and is not null, then it is coverted to a string.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @return A String value.
+ */
+ public String optString(int index) {
+ return optString(index, "");
+ }
+
+
+ /**
+ * Get the optional string associated with an index.
+ * The defaultValue is returned if the key is not found.
+ *
+ * @param index The index must be between 0 and length() - 1.
+ * @param defaultValue The default value.
+ * @return A String value.
+ */
+ public String optString(int index, String defaultValue) {
+ Object o = opt(index);
+ return o != null ? o.toString() : defaultValue;
+ }
+
+
+ /**
+ * Append a boolean value. This increases the array's length by one.
+ *
+ * @param value A boolean value.
+ * @return this.
+ */
+ public JSONArray put(boolean value) {
+ put(value ? Boolean.TRUE : Boolean.FALSE);
+ return this;
+ }
+
+
+ /**
+ * Put a value in the JSONArray, where the value will be a
+ * JSONArray which is produced from a Collection.
+ * @param value A Collection value.
+ * @return this.
+ */
+ public JSONArray put(Collection value) {
+ put(new JSONArray(value));
+ return this;
+ }
+
+
+ /**
+ * Append a double value. This increases the array's length by one.
+ *
+ * @param value A double value.
+ * @throws JSONException if the value is not finite.
+ * @return this.
+ */
+ public JSONArray put(double value) throws JSONException {
+ Double d = new Double(value);
+ JSONObject.testValidity(d);
+ put(d);
+ return this;
+ }
+
+
+ /**
+ * Append an int value. This increases the array's length by one.
+ *
+ * @param value An int value.
+ * @return this.
+ */
+ public JSONArray put(int value) {
+ put(new Integer(value));
+ return this;
+ }
+
+
+ /**
+ * Append an long value. This increases the array's length by one.
+ *
+ * @param value A long value.
+ * @return this.
+ */
+ public JSONArray put(long value) {
+ put(new Long(value));
+ return this;
+ }
+
+
+ /**
+ * Put a value in the JSONArray, where the value will be a
+ * JSONObject which is produced from a Map.
+ * @param value A Map value.
+ * @return this.
+ */
+ public JSONArray put(Map value) {
+ put(new JSONObject(value));
+ return this;
+ }
+
+
+ /**
+ * Append an object value. This increases the array's length by one.
+ * @param value An object value. The value should be a
+ * Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
+ * JSONObject.NULL object.
+ * @return this.
+ */
+ public JSONArray put(Object value) {
+ this.myArrayList.add(value);
+ return this;
+ }
+
+
+ /**
+ * Put or replace a boolean value in the JSONArray. If the index is greater
+ * than the length of the JSONArray, then null elements will be added as
+ * necessary to pad it out.
+ * @param index The subscript.
+ * @param value A boolean value.
+ * @return this.
+ * @throws JSONException If the index is negative.
+ */
+ public JSONArray put(int index, boolean value) throws JSONException {
+ put(index, value ? Boolean.TRUE : Boolean.FALSE);
+ return this;
+ }
+
+
+ /**
+ * Put a value in the JSONArray, where the value will be a
+ * JSONArray which is produced from a Collection.
+ * @param index The subscript.
+ * @param value A Collection value.
+ * @return this.
+ * @throws JSONException If the index is negative or if the value is
+ * not finite.
+ */
+ public JSONArray put(int index, Collection value) throws JSONException {
+ put(index, new JSONArray(value));
+ return this;
+ }
+
+
+ /**
+ * Put or replace a double value. If the index is greater than the length of
+ * the JSONArray, then null elements will be added as necessary to pad
+ * it out.
+ * @param index The subscript.
+ * @param value A double value.
+ * @return this.
+ * @throws JSONException If the index is negative or if the value is
+ * not finite.
+ */
+ public JSONArray put(int index, double value) throws JSONException {
+ put(index, new Double(value));
+ return this;
+ }
+
+
+ /**
+ * Put or replace an int value. If the index is greater than the length of
+ * the JSONArray, then null elements will be added as necessary to pad
+ * it out.
+ * @param index The subscript.
+ * @param value An int value.
+ * @return this.
+ * @throws JSONException If the index is negative.
+ */
+ public JSONArray put(int index, int value) throws JSONException {
+ put(index, new Integer(value));
+ return this;
+ }
+
+
+ /**
+ * Put or replace a long value. If the index is greater than the length of
+ * the JSONArray, then null elements will be added as necessary to pad
+ * it out.
+ * @param index The subscript.
+ * @param value A long value.
+ * @return this.
+ * @throws JSONException If the index is negative.
+ */
+ public JSONArray put(int index, long value) throws JSONException {
+ put(index, new Long(value));
+ return this;
+ }
+
+
+ /**
+ * Put a value in the JSONArray, where the value will be a
+ * JSONObject which is produced from a Map.
+ * @param index The subscript.
+ * @param value The Map value.
+ * @return this.
+ * @throws JSONException If the index is negative or if the the value is
+ * an invalid number.
+ */
+ public JSONArray put(int index, Map value) throws JSONException {
+ put(index, new JSONObject(value));
+ return this;
+ }
+
+
+ /**
+ * Put or replace an object value in the JSONArray. If the index is greater
+ * than the length of the JSONArray, then null elements will be added as
+ * necessary to pad it out.
+ * @param index The subscript.
+ * @param value The value to put into the array. The value should be a
+ * Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
+ * JSONObject.NULL object.
+ * @return this.
+ * @throws JSONException If the index is negative or if the the value is
+ * an invalid number.
+ */
+ public JSONArray put(int index, Object value) throws JSONException {
+ JSONObject.testValidity(value);
+ if (index < 0) {
+ throw new JSONException("JSONArray[" + index + "] not found.");
+ }
+ if (index < length()) {
+ this.myArrayList.set(index, value);
+ } else {
+ while (index != length()) {
+ put(JSONObject.NULL);
+ }
+ put(value);
+ }
+ return this;
+ }
+
+
+ /**
+ * Produce a JSONObject by combining a JSONArray of names with the values
+ * of this JSONArray.
+ * @param names A JSONArray containing a list of key strings. These will be
+ * paired with the values.
+ * @return A JSONObject, or null if there are no names or if this JSONArray
+ * has no values.
+ * @throws JSONException If any of the names are null.
+ */
+ public JSONObject toJSONObject(JSONArray names) throws JSONException {
+ if (names == null || names.length() == 0 || length() == 0) {
+ return null;
+ }
+ JSONObject jo = new JSONObject();
+ for (int i = 0; i < names.length(); i += 1) {
+ jo.put(names.getString(i), this.opt(i));
+ }
+ return jo;
+ }
+
+
+ /**
+ * Make a JSON text of this JSONArray. For compactness, no
+ * unnecessary whitespace is added. If it is not possible to produce a
+ * syntactically correct JSON text then null will be returned instead. This
+ * could occur if the array contains an invalid number.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ *
+ * @return a printable, displayable, transmittable
+ * representation of the array.
+ */
+ public String toString() {
+ try {
+ return '[' + join(",") + ']';
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+
+ /**
+ * Make a prettyprinted JSON text of this JSONArray.
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param indentFactor The number of spaces to add to each level of
+ * indentation.
+ * @return a printable, displayable, transmittable
+ * representation of the object, beginning
+ * with <code>[</code> <small>(left bracket)</small> and ending
+ * with <code>]</code> <small>(right bracket)</small>.
+ * @throws JSONException
+ */
+ public String toString(int indentFactor) throws JSONException {
+ return toString(indentFactor, 0);
+ }
+
+
+ /**
+ * Make a prettyprinted JSON text of this JSONArray.
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param indentFactor The number of spaces to add to each level of
+ * indentation.
+ * @param indent The indention of the top level.
+ * @return a printable, displayable, transmittable
+ * representation of the array.
+ * @throws JSONException
+ */
+ String toString(int indentFactor, int indent) throws JSONException {
+ int len = length();
+ if (len == 0) {
+ return "[]";
+ }
+ int i;
+ StringBuffer sb = new StringBuffer("[");
+ if (len == 1) {
+ sb.append(JSONObject.valueToString(this.myArrayList.get(0),
+ indentFactor, indent));
+ } else {
+ int newindent = indent + indentFactor;
+ sb.append('\n');
+ for (i = 0; i < len; i += 1) {
+ if (i > 0) {
+ sb.append(",\n");
+ }
+ for (int j = 0; j < newindent; j += 1) {
+ sb.append(' ');
+ }
+ sb.append(JSONObject.valueToString(this.myArrayList.get(i),
+ indentFactor, newindent));
+ }
+ sb.append('\n');
+ for (i = 0; i < indent; i += 1) {
+ sb.append(' ');
+ }
+ }
+ sb.append(']');
+ return sb.toString();
+ }
+
+
+ /**
+ * Write the contents of the JSONArray as JSON text to a writer.
+ * For compactness, no whitespace is added.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ *
+ * @return The writer.
+ * @throws JSONException
+ */
+ public Writer write(Writer writer) throws JSONException {
+ try {
+ boolean b = false;
+ int len = length();
+
+ writer.write('[');
+
+ for (int i = 0; i < len; i += 1) {
+ if (b) {
+ writer.write(',');
+ }
+ Object v = this.myArrayList.get(i);
+ if (v instanceof JSONObject) {
+ ((JSONObject)v).write(writer);
+ } else if (v instanceof JSONArray) {
+ ((JSONArray)v).write(writer);
+ } else {
+ writer.write(JSONObject.valueToString(v));
+ }
+ b = true;
+ }
+ writer.write(']');
+ return writer;
+ } catch (IOException e) {
+ throw new JSONException(e);
+ }
+ }
+}
\ No newline at end of file
Added: trunk/java/org/apache/tomcat/util/json/JSONException.java
===================================================================
--- trunk/java/org/apache/tomcat/util/json/JSONException.java (rev 0)
+++ trunk/java/org/apache/tomcat/util/json/JSONException.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,27 @@
+package org.apache.tomcat.util.json;
+
+/**
+ * The JSONException is thrown by the JSON.org classes then things are amiss.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONException extends Exception {
+ private Throwable cause;
+
+ /**
+ * Constructs a JSONException with an explanatory message.
+ * @param message Detail about the reason for the exception.
+ */
+ public JSONException(String message) {
+ super(message);
+ }
+
+ public JSONException(Throwable t) {
+ super(t.getMessage());
+ this.cause = t;
+ }
+
+ public Throwable getCause() {
+ return this.cause;
+ }
+}
Added: trunk/java/org/apache/tomcat/util/json/JSONObject.java
===================================================================
--- trunk/java/org/apache/tomcat/util/json/JSONObject.java (rev 0)
+++ trunk/java/org/apache/tomcat/util/json/JSONObject.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,1550 @@
+package org.apache.tomcat.util.json;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+import java.io.IOException;
+import java.io.Writer;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeSet;
+
+/**
+ * A JSONObject is an unordered collection of name/value pairs. Its
+ * external form is a string wrapped in curly braces with colons between the
+ * names and values, and commas between the values and names. The internal form
+ * is an object having <code>get</code> and <code>opt</code> methods for
+ * accessing the values by name, and <code>put</code> methods for adding or
+ * replacing values by name. The values can be any of these types:
+ * <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>,
+ * <code>Number</code>, <code>String</code>, or the <code>JSONObject.NULL</code>
+ * object. A JSONObject constructor can be used to convert an external form
+ * JSON text into an internal form whose values can be retrieved with the
+ * <code>get</code> and <code>opt</code> methods, or to convert values into a
+ * JSON text using the <code>put</code> and <code>toString</code> methods.
+ * A <code>get</code> method returns a value if one can be found, and throws an
+ * exception if one cannot be found. An <code>opt</code> method returns a
+ * default value instead of throwing an exception, and so is useful for
+ * obtaining optional values.
+ * <p>
+ * The generic <code>get()</code> and <code>opt()</code> methods return an
+ * object, which you can cast or query for type. There are also typed
+ * <code>get</code> and <code>opt</code> methods that do type checking and type
+ * coercion for you.
+ * <p>
+ * The <code>put</code> methods adds values to an object. For example, <pre>
+ * myString = new JSONObject().put("JSON", "Hello, World!").toString();</pre>
+ * produces the string <code>{"JSON": "Hello, World"}</code>.
+ * <p>
+ * The texts produced by the <code>toString</code> methods strictly conform to
+ * the JSON syntax rules.
+ * The constructors are more forgiving in the texts they will accept:
+ * <ul>
+ * <li>An extra <code>,</code> <small>(comma)</small> may appear just
+ * before the closing brace.</li>
+ * <li>Strings may be quoted with <code>'</code> <small>(single
+ * quote)</small>.</li>
+ * <li>Strings do not need to be quoted at all if they do not begin with a quote
+ * or single quote, and if they do not contain leading or trailing spaces,
+ * and if they do not contain any of these characters:
+ * <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
+ * and if they are not the reserved words <code>true</code>,
+ * <code>false</code>, or <code>null</code>.</li>
+ * <li>Keys can be followed by <code>=</code> or <code>=></code> as well as
+ * by <code>:</code>.</li>
+ * <li>Values can be followed by <code>;</code> <small>(semicolon)</small> as
+ * well as by <code>,</code> <small>(comma)</small>.</li>
+ * <li>Numbers may have the <code>0-</code> <small>(octal)</small> or
+ * <code>0x-</code> <small>(hex)</small> prefix.</li>
+ * </ul>
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONObject {
+
+ /**
+ * JSONObject.NULL is equivalent to the value that JavaScript calls null,
+ * whilst Java's null is equivalent to the value that JavaScript calls
+ * undefined.
+ */
+ private static final class Null {
+
+ /**
+ * There is only intended to be a single instance of the NULL object,
+ * so the clone method returns itself.
+ * @return NULL.
+ */
+ protected final Object clone() {
+ return this;
+ }
+
+
+ /**
+ * A Null object is equal to the null value and to itself.
+ * @param object An object to test for nullness.
+ * @return true if the object parameter is the JSONObject.NULL object
+ * or null.
+ */
+ public boolean equals(Object object) {
+ return object == null || object == this;
+ }
+
+
+ /**
+ * Get the "null" string value.
+ * @return The string "null".
+ */
+ public String toString() {
+ return "null";
+ }
+ }
+
+
+ /**
+ * The map where the JSONObject's properties are kept.
+ */
+ private Map map;
+
+
+ /**
+ * It is sometimes more convenient and less ambiguous to have a
+ * <code>NULL</code> object than to use Java's <code>null</code> value.
+ * <code>JSONObject.NULL.equals(null)</code> returns <code>true</code>.
+ * <code>JSONObject.NULL.toString()</code> returns <code>"null"</code>.
+ */
+ public static final Object NULL = new Null();
+
+
+ /**
+ * Construct an empty JSONObject.
+ */
+ public JSONObject() {
+ this.map = new HashMap();
+ }
+
+
+ /**
+ * Construct a JSONObject from a subset of another JSONObject.
+ * An array of strings is used to identify the keys that should be copied.
+ * Missing keys are ignored.
+ * @param jo A JSONObject.
+ * @param names An array of strings.
+ * @exception JSONException If a value is a non-finite number or if a name is duplicated.
+ */
+ public JSONObject(JSONObject jo, String[] names) throws JSONException {
+ this();
+ for (int i = 0; i < names.length; i += 1) {
+ putOnce(names[i], jo.opt(names[i]));
+ }
+ }
+
+
+ /**
+ * Construct a JSONObject from a JSONTokener.
+ * @param x A JSONTokener object containing the source string.
+ * @throws JSONException If there is a syntax error in the source string
+ * or a duplicated key.
+ */
+ public JSONObject(JSONTokener x) throws JSONException {
+ this();
+ char c;
+ String key;
+
+ if (x.nextClean() != '{') {
+ throw x.syntaxError("A JSONObject text must begin with '{'");
+ }
+ for (;;) {
+ c = x.nextClean();
+ switch (c) {
+ case 0:
+ throw x.syntaxError("A JSONObject text must end with '}'");
+ case '}':
+ return;
+ default:
+ x.back();
+ key = x.nextValue().toString();
+ }
+
+ /*
+ * The key is followed by ':'. We will also tolerate '=' or '=>'.
+ */
+
+ c = x.nextClean();
+ if (c == '=') {
+ if (x.next() != '>') {
+ x.back();
+ }
+ } else if (c != ':') {
+ throw x.syntaxError("Expected a ':' after a key");
+ }
+ putOnce(key, x.nextValue());
+
+ /*
+ * Pairs are separated by ','. We will also tolerate ';'.
+ */
+
+ switch (x.nextClean()) {
+ case ';':
+ case ',':
+ if (x.nextClean() == '}') {
+ return;
+ }
+ x.back();
+ break;
+ case '}':
+ return;
+ default:
+ throw x.syntaxError("Expected a ',' or '}'");
+ }
+ }
+ }
+
+
+ /**
+ * Construct a JSONObject from a Map.
+ *
+ * @param map A map object that can be used to initialize the contents of
+ * the JSONObject.
+ */
+ public JSONObject(Map map) {
+ this.map = (map == null) ? new HashMap() : map;
+ }
+
+ /**
+ * Construct a JSONObject from a Map.
+ *
+ * Note: Use this constructor when the map contains <key,bean>.
+ *
+ * @param map - A map with Key-Bean data.
+ * @param includeSuperClass - Tell whether to include the super class properties.
+ */
+ public JSONObject(Map map, boolean includeSuperClass) {
+ this.map = new HashMap();
+ if (map != null){
+ for (Iterator i = map.entrySet().iterator(); i.hasNext(); ) {
+ Map.Entry e = (Map.Entry)i.next();
+ this.map.put(e.getKey(), new JSONObject(e.getValue(), includeSuperClass));
+ }
+ }
+ }
+
+
+ /**
+ * Construct a JSONObject from an Object using bean getters.
+ * It reflects on all of the public methods of the object.
+ * For each of the methods with no parameters and a name starting
+ * with <code>"get"</code> or <code>"is"</code> followed by an uppercase letter,
+ * the method is invoked, and a key and the value returned from the getter method
+ * are put into the new JSONObject.
+ *
+ * The key is formed by removing the <code>"get"</code> or <code>"is"</code> prefix. If the second remaining
+ * character is not upper case, then the first
+ * character is converted to lower case.
+ *
+ * For example, if an object has a method named <code>"getName"</code>, and
+ * if the result of calling <code>object.getName()</code> is <code>"Larry Fine"</code>,
+ * then the JSONObject will contain <code>"name": "Larry Fine"</code>.
+ *
+ * @param bean An object that has getter methods that should be used
+ * to make a JSONObject.
+ */
+ public JSONObject(Object bean) {
+ this();
+ populateInternalMap(bean, false);
+ }
+
+
+ /**
+ * Construct JSONObject from the given bean. This will also create JSONObject
+ * for all internal object (List, Map, Inner Objects) of the provided bean.
+ *
+ * -- See Documentation of JSONObject(Object bean) also.
+ *
+ * @param bean An object that has getter methods that should be used
+ * to make a JSONObject.
+ * @param includeSuperClass - Tell whether to include the super class properties.
+ */
+ public JSONObject(Object bean, boolean includeSuperClass) {
+ this();
+ populateInternalMap(bean, includeSuperClass);
+ }
+
+ private void populateInternalMap(Object bean, boolean includeSuperClass){
+ Class klass = bean.getClass();
+
+ //If klass.getSuperClass is System class then includeSuperClass = false;
+
+ if (klass.getClassLoader() == null) {
+ includeSuperClass = false;
+ }
+
+ Method[] methods = (includeSuperClass) ?
+ klass.getMethods() : klass.getDeclaredMethods();
+ for (int i = 0; i < methods.length; i += 1) {
+ try {
+ Method method = methods[i];
+ String name = method.getName();
+ String key = "";
+ if (name.startsWith("get")) {
+ key = name.substring(3);
+ } else if (name.startsWith("is")) {
+ key = name.substring(2);
+ }
+ if (key.length() > 0 &&
+ Character.isUpperCase(key.charAt(0)) &&
+ method.getParameterTypes().length == 0) {
+ if (key.length() == 1) {
+ key = key.toLowerCase();
+ } else if (!Character.isUpperCase(key.charAt(1))) {
+ key = key.substring(0, 1).toLowerCase() +
+ key.substring(1);
+ }
+
+ Object result = method.invoke(bean, (Object[])null);
+ if (result == null){
+ map.put(key, NULL);
+ }else if (result.getClass().isArray()) {
+ map.put(key, new JSONArray(result,includeSuperClass));
+ }else if (result instanceof Collection) { //List or Set
+ map.put(key, new JSONArray((Collection)result,includeSuperClass));
+ }else if (result instanceof Map) {
+ map.put(key, new JSONObject((Map)result,includeSuperClass));
+ }else if (isStandardProperty(result.getClass())) { //Primitives, String and Wrapper
+ map.put(key, result);
+ }else{
+ if (result.getClass().getPackage().getName().startsWith("java") ||
+ result.getClass().getClassLoader() == null) {
+ map.put(key, result.toString());
+ } else { //User defined Objects
+ map.put(key, new JSONObject(result,includeSuperClass));
+ }
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private boolean isStandardProperty(Class clazz) {
+ return clazz.isPrimitive() ||
+ clazz.isAssignableFrom(Byte.class) ||
+ clazz.isAssignableFrom(Short.class) ||
+ clazz.isAssignableFrom(Integer.class) ||
+ clazz.isAssignableFrom(Long.class) ||
+ clazz.isAssignableFrom(Float.class) ||
+ clazz.isAssignableFrom(Double.class) ||
+ clazz.isAssignableFrom(Character.class) ||
+ clazz.isAssignableFrom(String.class) ||
+ clazz.isAssignableFrom(Boolean.class);
+ }
+
+ /**
+ * Construct a JSONObject from an Object, using reflection to find the
+ * public members. The resulting JSONObject's keys will be the strings
+ * from the names array, and the values will be the field values associated
+ * with those keys in the object. If a key is not found or not visible,
+ * then it will not be copied into the new JSONObject.
+ * @param object An object that has fields that should be used to make a
+ * JSONObject.
+ * @param names An array of strings, the names of the fields to be obtained
+ * from the object.
+ */
+ public JSONObject(Object object, String names[]) {
+ this();
+ Class c = object.getClass();
+ for (int i = 0; i < names.length; i += 1) {
+ String name = names[i];
+ try {
+ putOpt(name, c.getField(name).get(object));
+ } catch (Exception e) {
+ /* forget about it */
+ }
+ }
+ }
+
+
+ /**
+ * Construct a JSONObject from a source JSON text string.
+ * This is the most commonly used JSONObject constructor.
+ * @param source A string beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ * @exception JSONException If there is a syntax error in the source
+ * string or a duplicated key.
+ */
+ public JSONObject(String source) throws JSONException {
+ this(new JSONTokener(source));
+ }
+
+
+ /**
+ * Accumulate values under a key. It is similar to the put method except
+ * that if there is already an object stored under the key then a
+ * JSONArray is stored under the key to hold all of the accumulated values.
+ * If there is already a JSONArray, then the new value is appended to it.
+ * In contrast, the put method replaces the previous value.
+ * @param key A key string.
+ * @param value An object to be accumulated under the key.
+ * @return this.
+ * @throws JSONException If the value is an invalid number
+ * or if the key is null.
+ */
+ public JSONObject accumulate(String key, Object value)
+ throws JSONException {
+ testValidity(value);
+ Object o = opt(key);
+ if (o == null) {
+ put(key, value instanceof JSONArray ?
+ new JSONArray().put(value) :
+ value);
+ } else if (o instanceof JSONArray) {
+ ((JSONArray)o).put(value);
+ } else {
+ put(key, new JSONArray().put(o).put(value));
+ }
+ return this;
+ }
+
+
+ /**
+ * Append values to the array under a key. If the key does not exist in the
+ * JSONObject, then the key is put in the JSONObject with its value being a
+ * JSONArray containing the value parameter. If the key was already
+ * associated with a JSONArray, then the value parameter is appended to it.
+ * @param key A key string.
+ * @param value An object to be accumulated under the key.
+ * @return this.
+ * @throws JSONException If the key is null or if the current value
+ * associated with the key is not a JSONArray.
+ */
+ public JSONObject append(String key, Object value)
+ throws JSONException {
+ testValidity(value);
+ Object o = opt(key);
+ if (o == null) {
+ put(key, new JSONArray().put(value));
+ } else if (o instanceof JSONArray) {
+ put(key, ((JSONArray)o).put(value));
+ } else {
+ throw new JSONException("JSONObject[" + key +
+ "] is not a JSONArray.");
+ }
+ return this;
+ }
+
+
+ /**
+ * Produce a string from a double. The string "null" will be returned if
+ * the number is not finite.
+ * @param d A double.
+ * @return A String.
+ */
+ static public String doubleToString(double d) {
+ if (Double.isInfinite(d) || Double.isNaN(d)) {
+ return "null";
+ }
+
+// Shave off trailing zeros and decimal point, if possible.
+
+ String s = Double.toString(d);
+ if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
+ while (s.endsWith("0")) {
+ s = s.substring(0, s.length() - 1);
+ }
+ if (s.endsWith(".")) {
+ s = s.substring(0, s.length() - 1);
+ }
+ }
+ return s;
+ }
+
+
+ /**
+ * Get the value object associated with a key.
+ *
+ * @param key A key string.
+ * @return The object associated with the key.
+ * @throws JSONException if the key is not found.
+ */
+ public Object get(String key) throws JSONException {
+ Object o = opt(key);
+ if (o == null) {
+ throw new JSONException("JSONObject[" + quote(key) +
+ "] not found.");
+ }
+ return o;
+ }
+
+
+ /**
+ * Get the boolean value associated with a key.
+ *
+ * @param key A key string.
+ * @return The truth.
+ * @throws JSONException
+ * if the value is not a Boolean or the String "true" or "false".
+ */
+ public boolean getBoolean(String key) throws JSONException {
+ Object o = get(key);
+ if (o.equals(Boolean.FALSE) ||
+ (o instanceof String &&
+ ((String)o).equalsIgnoreCase("false"))) {
+ return false;
+ } else if (o.equals(Boolean.TRUE) ||
+ (o instanceof String &&
+ ((String)o).equalsIgnoreCase("true"))) {
+ return true;
+ }
+ throw new JSONException("JSONObject[" + quote(key) +
+ "] is not a Boolean.");
+ }
+
+
+ /**
+ * Get the double value associated with a key.
+ * @param key A key string.
+ * @return The numeric value.
+ * @throws JSONException if the key is not found or
+ * if the value is not a Number object and cannot be converted to a number.
+ */
+ public double getDouble(String key) throws JSONException {
+ Object o = get(key);
+ try {
+ return o instanceof Number ?
+ ((Number)o).doubleValue() :
+ Double.valueOf((String)o).doubleValue();
+ } catch (Exception e) {
+ throw new JSONException("JSONObject[" + quote(key) +
+ "] is not a number.");
+ }
+ }
+
+
+ /**
+ * Get the int value associated with a key. If the number value is too
+ * large for an int, it will be clipped.
+ *
+ * @param key A key string.
+ * @return The integer value.
+ * @throws JSONException if the key is not found or if the value cannot
+ * be converted to an integer.
+ */
+ public int getInt(String key) throws JSONException {
+ Object o = get(key);
+ return o instanceof Number ?
+ ((Number)o).intValue() : (int)getDouble(key);
+ }
+
+
+ /**
+ * Get the JSONArray value associated with a key.
+ *
+ * @param key A key string.
+ * @return A JSONArray which is the value.
+ * @throws JSONException if the key is not found or
+ * if the value is not a JSONArray.
+ */
+ public JSONArray getJSONArray(String key) throws JSONException {
+ Object o = get(key);
+ if (o instanceof JSONArray) {
+ return (JSONArray)o;
+ }
+ throw new JSONException("JSONObject[" + quote(key) +
+ "] is not a JSONArray.");
+ }
+
+
+ /**
+ * Get the JSONObject value associated with a key.
+ *
+ * @param key A key string.
+ * @return A JSONObject which is the value.
+ * @throws JSONException if the key is not found or
+ * if the value is not a JSONObject.
+ */
+ public JSONObject getJSONObject(String key) throws JSONException {
+ Object o = get(key);
+ if (o instanceof JSONObject) {
+ return (JSONObject)o;
+ }
+ throw new JSONException("JSONObject[" + quote(key) +
+ "] is not a JSONObject.");
+ }
+
+
+ /**
+ * Get the long value associated with a key. If the number value is too
+ * long for a long, it will be clipped.
+ *
+ * @param key A key string.
+ * @return The long value.
+ * @throws JSONException if the key is not found or if the value cannot
+ * be converted to a long.
+ */
+ public long getLong(String key) throws JSONException {
+ Object o = get(key);
+ return o instanceof Number ?
+ ((Number)o).longValue() : (long)getDouble(key);
+ }
+
+
+ /**
+ * Get an array of field names from a JSONObject.
+ *
+ * @return An array of field names, or null if there are no names.
+ */
+ public static String[] getNames(JSONObject jo) {
+ int length = jo.length();
+ if (length == 0) {
+ return null;
+ }
+ Iterator i = jo.keys();
+ String[] names = new String[length];
+ int j = 0;
+ while (i.hasNext()) {
+ names[j] = (String)i.next();
+ j += 1;
+ }
+ return names;
+ }
+
+
+ /**
+ * Get an array of field names from an Object.
+ *
+ * @return An array of field names, or null if there are no names.
+ */
+ public static String[] getNames(Object object) {
+ if (object == null) {
+ return null;
+ }
+ Class klass = object.getClass();
+ Field[] fields = klass.getFields();
+ int length = fields.length;
+ if (length == 0) {
+ return null;
+ }
+ String[] names = new String[length];
+ for (int i = 0; i < length; i += 1) {
+ names[i] = fields[i].getName();
+ }
+ return names;
+ }
+
+
+ /**
+ * Get the string associated with a key.
+ *
+ * @param key A key string.
+ * @return A string which is the value.
+ * @throws JSONException if the key is not found.
+ */
+ public String getString(String key) throws JSONException {
+ return get(key).toString();
+ }
+
+
+ /**
+ * Determine if the JSONObject contains a specific key.
+ * @param key A key string.
+ * @return true if the key exists in the JSONObject.
+ */
+ public boolean has(String key) {
+ return this.map.containsKey(key);
+ }
+
+
+ /**
+ * Determine if the value associated with the key is null or if there is
+ * no value.
+ * @param key A key string.
+ * @return true if there is no value associated with the key or if
+ * the value is the JSONObject.NULL object.
+ */
+ public boolean isNull(String key) {
+ return JSONObject.NULL.equals(opt(key));
+ }
+
+
+ /**
+ * Get an enumeration of the keys of the JSONObject.
+ *
+ * @return An iterator of the keys.
+ */
+ public Iterator keys() {
+ return this.map.keySet().iterator();
+ }
+
+
+ /**
+ * Get the number of keys stored in the JSONObject.
+ *
+ * @return The number of keys in the JSONObject.
+ */
+ public int length() {
+ return this.map.size();
+ }
+
+
+ /**
+ * Produce a JSONArray containing the names of the elements of this
+ * JSONObject.
+ * @return A JSONArray containing the key strings, or null if the JSONObject
+ * is empty.
+ */
+ public JSONArray names() {
+ JSONArray ja = new JSONArray();
+ Iterator keys = keys();
+ while (keys.hasNext()) {
+ ja.put(keys.next());
+ }
+ return ja.length() == 0 ? null : ja;
+ }
+
+ /**
+ * Produce a string from a Number.
+ * @param n A Number
+ * @return A String.
+ * @throws JSONException If n is a non-finite number.
+ */
+ static public String numberToString(Number n)
+ throws JSONException {
+ if (n == null) {
+ throw new JSONException("Null pointer");
+ }
+ testValidity(n);
+
+// Shave off trailing zeros and decimal point, if possible.
+
+ String s = n.toString();
+ if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
+ while (s.endsWith("0")) {
+ s = s.substring(0, s.length() - 1);
+ }
+ if (s.endsWith(".")) {
+ s = s.substring(0, s.length() - 1);
+ }
+ }
+ return s;
+ }
+
+
+ /**
+ * Get an optional value associated with a key.
+ * @param key A key string.
+ * @return An object which is the value, or null if there is no value.
+ */
+ public Object opt(String key) {
+ return key == null ? null : this.map.get(key);
+ }
+
+
+ /**
+ * Get an optional boolean associated with a key.
+ * It returns false if there is no such key, or if the value is not
+ * Boolean.TRUE or the String "true".
+ *
+ * @param key A key string.
+ * @return The truth.
+ */
+ public boolean optBoolean(String key) {
+ return optBoolean(key, false);
+ }
+
+
+ /**
+ * Get an optional boolean associated with a key.
+ * It returns the defaultValue if there is no such key, or if it is not
+ * a Boolean or the String "true" or "false" (case insensitive).
+ *
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return The truth.
+ */
+ public boolean optBoolean(String key, boolean defaultValue) {
+ try {
+ return getBoolean(key);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Put a key/value pair in the JSONObject, where the value will be a
+ * JSONArray which is produced from a Collection.
+ * @param key A key string.
+ * @param value A Collection value.
+ * @return this.
+ * @throws JSONException
+ */
+ public JSONObject put(String key, Collection value) throws JSONException {
+ put(key, new JSONArray(value));
+ return this;
+ }
+
+
+ /**
+ * Get an optional double associated with a key,
+ * or NaN if there is no such key or if its value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A string which is the key.
+ * @return An object which is the value.
+ */
+ public double optDouble(String key) {
+ return optDouble(key, Double.NaN);
+ }
+
+
+ /**
+ * Get an optional double associated with a key, or the
+ * defaultValue if there is no such key or if its value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return An object which is the value.
+ */
+ public double optDouble(String key, double defaultValue) {
+ try {
+ Object o = opt(key);
+ return o instanceof Number ? ((Number)o).doubleValue() :
+ new Double((String)o).doubleValue();
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get an optional int value associated with a key,
+ * or zero if there is no such key or if the value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A key string.
+ * @return An object which is the value.
+ */
+ public int optInt(String key) {
+ return optInt(key, 0);
+ }
+
+
+ /**
+ * Get an optional int value associated with a key,
+ * or the default if there is no such key or if the value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return An object which is the value.
+ */
+ public int optInt(String key, int defaultValue) {
+ try {
+ return getInt(key);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get an optional JSONArray associated with a key.
+ * It returns null if there is no such key, or if its value is not a
+ * JSONArray.
+ *
+ * @param key A key string.
+ * @return A JSONArray which is the value.
+ */
+ public JSONArray optJSONArray(String key) {
+ Object o = opt(key);
+ return o instanceof JSONArray ? (JSONArray)o : null;
+ }
+
+
+ /**
+ * Get an optional JSONObject associated with a key.
+ * It returns null if there is no such key, or if its value is not a
+ * JSONObject.
+ *
+ * @param key A key string.
+ * @return A JSONObject which is the value.
+ */
+ public JSONObject optJSONObject(String key) {
+ Object o = opt(key);
+ return o instanceof JSONObject ? (JSONObject)o : null;
+ }
+
+
+ /**
+ * Get an optional long value associated with a key,
+ * or zero if there is no such key or if the value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A key string.
+ * @return An object which is the value.
+ */
+ public long optLong(String key) {
+ return optLong(key, 0);
+ }
+
+
+ /**
+ * Get an optional long value associated with a key,
+ * or the default if there is no such key or if the value is not a number.
+ * If the value is a string, an attempt will be made to evaluate it as
+ * a number.
+ *
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return An object which is the value.
+ */
+ public long optLong(String key, long defaultValue) {
+ try {
+ return getLong(key);
+ } catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+
+ /**
+ * Get an optional string associated with a key.
+ * It returns an empty string if there is no such key. If the value is not
+ * a string and is not null, then it is coverted to a string.
+ *
+ * @param key A key string.
+ * @return A string which is the value.
+ */
+ public String optString(String key) {
+ return optString(key, "");
+ }
+
+
+ /**
+ * Get an optional string associated with a key.
+ * It returns the defaultValue if there is no such key.
+ *
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return A string which is the value.
+ */
+ public String optString(String key, String defaultValue) {
+ Object o = opt(key);
+ return o != null ? o.toString() : defaultValue;
+ }
+
+
+ /**
+ * Put a key/boolean pair in the JSONObject.
+ *
+ * @param key A key string.
+ * @param value A boolean which is the value.
+ * @return this.
+ * @throws JSONException If the key is null.
+ */
+ public JSONObject put(String key, boolean value) throws JSONException {
+ put(key, value ? Boolean.TRUE : Boolean.FALSE);
+ return this;
+ }
+
+
+ /**
+ * Put a key/double pair in the JSONObject.
+ *
+ * @param key A key string.
+ * @param value A double which is the value.
+ * @return this.
+ * @throws JSONException If the key is null or if the number is invalid.
+ */
+ public JSONObject put(String key, double value) throws JSONException {
+ put(key, new Double(value));
+ return this;
+ }
+
+
+ /**
+ * Put a key/int pair in the JSONObject.
+ *
+ * @param key A key string.
+ * @param value An int which is the value.
+ * @return this.
+ * @throws JSONException If the key is null.
+ */
+ public JSONObject put(String key, int value) throws JSONException {
+ put(key, new Integer(value));
+ return this;
+ }
+
+
+ /**
+ * Put a key/long pair in the JSONObject.
+ *
+ * @param key A key string.
+ * @param value A long which is the value.
+ * @return this.
+ * @throws JSONException If the key is null.
+ */
+ public JSONObject put(String key, long value) throws JSONException {
+ put(key, new Long(value));
+ return this;
+ }
+
+
+ /**
+ * Put a key/value pair in the JSONObject, where the value will be a
+ * JSONObject which is produced from a Map.
+ * @param key A key string.
+ * @param value A Map value.
+ * @return this.
+ * @throws JSONException
+ */
+ public JSONObject put(String key, Map value) throws JSONException {
+ put(key, new JSONObject(value));
+ return this;
+ }
+
+
+ /**
+ * Put a key/value pair in the JSONObject. If the value is null,
+ * then the key will be removed from the JSONObject if it is present.
+ * @param key A key string.
+ * @param value An object which is the value. It should be of one of these
+ * types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
+ * or the JSONObject.NULL object.
+ * @return this.
+ * @throws JSONException If the value is non-finite number
+ * or if the key is null.
+ */
+ public JSONObject put(String key, Object value) throws JSONException {
+ if (key == null) {
+ throw new JSONException("Null key.");
+ }
+ if (value != null) {
+ testValidity(value);
+ this.map.put(key, value);
+ } else {
+ remove(key);
+ }
+ return this;
+ }
+
+
+ /**
+ * Put a key/value pair in the JSONObject, but only if the key and the
+ * value are both non-null, and only if there is not already a member
+ * with that name.
+ * @param key
+ * @param value
+ * @return his.
+ * @throws JSONException if the key is a duplicate
+ */
+ public JSONObject putOnce(String key, Object value) throws JSONException {
+ if (key != null && value != null) {
+ if (opt(key) != null) {
+ throw new JSONException("Duplicate key \"" + key + "\"");
+ }
+ put(key, value);
+ }
+ return this;
+ }
+
+
+ /**
+ * Put a key/value pair in the JSONObject, but only if the
+ * key and the value are both non-null.
+ * @param key A key string.
+ * @param value An object which is the value. It should be of one of these
+ * types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
+ * or the JSONObject.NULL object.
+ * @return this.
+ * @throws JSONException If the value is a non-finite number.
+ */
+ public JSONObject putOpt(String key, Object value) throws JSONException {
+ if (key != null && value != null) {
+ put(key, value);
+ }
+ return this;
+ }
+
+
+ /**
+ * Produce a string in double quotes with backslash sequences in all the
+ * right places. A backslash will be inserted within </, allowing JSON
+ * text to be delivered in HTML. In JSON text, a string cannot contain a
+ * control character or an unescaped quote or backslash.
+ * @param string A String
+ * @return A String correctly formatted for insertion in a JSON text.
+ */
+ public static String quote(String string) {
+ if (string == null || string.length() == 0) {
+ return "\"\"";
+ }
+
+ char b;
+ char c = 0;
+ int i;
+ int len = string.length();
+ StringBuffer sb = new StringBuffer(len + 4);
+ String t;
+
+ sb.append('"');
+ for (i = 0; i < len; i += 1) {
+ b = c;
+ c = string.charAt(i);
+ switch (c) {
+ case '\\':
+ case '"':
+ sb.append('\\');
+ sb.append(c);
+ break;
+ case '/':
+ if (b == '<') {
+ sb.append('\\');
+ }
+ sb.append(c);
+ break;
+ case '\b':
+ sb.append("\\b");
+ break;
+ case '\t':
+ sb.append("\\t");
+ break;
+ case '\n':
+ sb.append("\\n");
+ break;
+ case '\f':
+ sb.append("\\f");
+ break;
+ case '\r':
+ sb.append("\\r");
+ break;
+ default:
+ if (c < ' ' || (c >= '\u0080' && c < '\u00a0') ||
+ (c >= '\u2000' && c < '\u2100')) {
+ t = "000" + Integer.toHexString(c);
+ sb.append("\\u" + t.substring(t.length() - 4));
+ } else {
+ sb.append(c);
+ }
+ }
+ }
+ sb.append('"');
+ return sb.toString();
+ }
+
+ /**
+ * Remove a name and its value, if present.
+ * @param key The name to be removed.
+ * @return The value that was associated with the name,
+ * or null if there was no value.
+ */
+ public Object remove(String key) {
+ return this.map.remove(key);
+ }
+
+ /**
+ * Get an enumeration of the keys of the JSONObject.
+ * The keys will be sorted alphabetically.
+ *
+ * @return An iterator of the keys.
+ */
+ public Iterator sortedKeys() {
+ return new TreeSet(this.map.keySet()).iterator();
+ }
+
+ /**
+ * Try to convert a string into a number, boolean, or null. If the string
+ * can't be converted, return the string.
+ * @param s A String.
+ * @return A simple JSON value.
+ */
+ static public Object stringToValue(String s) {
+ if (s.equals("")) {
+ return s;
+ }
+ if (s.equalsIgnoreCase("true")) {
+ return Boolean.TRUE;
+ }
+ if (s.equalsIgnoreCase("false")) {
+ return Boolean.FALSE;
+ }
+ if (s.equalsIgnoreCase("null")) {
+ return JSONObject.NULL;
+ }
+
+ /*
+ * If it might be a number, try converting it. We support the 0- and 0x-
+ * conventions. If a number cannot be produced, then the value will just
+ * be a string. Note that the 0-, 0x-, plus, and implied string
+ * conventions are non-standard. A JSON parser is free to accept
+ * non-JSON forms as long as it accepts all correct JSON forms.
+ */
+
+ char b = s.charAt(0);
+ if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+') {
+ if (b == '0') {
+ if (s.length() > 2 &&
+ (s.charAt(1) == 'x' || s.charAt(1) == 'X')) {
+ try {
+ return new Integer(Integer.parseInt(s.substring(2),
+ 16));
+ } catch (Exception e) {
+ /* Ignore the error */
+ }
+ } else {
+ try {
+ return new Integer(Integer.parseInt(s, 8));
+ } catch (Exception e) {
+ /* Ignore the error */
+ }
+ }
+ }
+ try {
+ return new Integer(s);
+ } catch (Exception e) {
+ try {
+ return new Long(s);
+ } catch (Exception f) {
+ try {
+ return new Double(s);
+ } catch (Exception g) {
+ /* Ignore the error */
+ }
+ }
+ }
+ }
+ return s;
+ }
+
+
+ /**
+ * Throw an exception if the object is an NaN or infinite number.
+ * @param o The object to test.
+ * @throws JSONException If o is a non-finite number.
+ */
+ static void testValidity(Object o) throws JSONException {
+ if (o != null) {
+ if (o instanceof Double) {
+ if (((Double)o).isInfinite() || ((Double)o).isNaN()) {
+ throw new JSONException(
+ "JSON does not allow non-finite numbers.");
+ }
+ } else if (o instanceof Float) {
+ if (((Float)o).isInfinite() || ((Float)o).isNaN()) {
+ throw new JSONException(
+ "JSON does not allow non-finite numbers.");
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Produce a JSONArray containing the values of the members of this
+ * JSONObject.
+ * @param names A JSONArray containing a list of key strings. This
+ * determines the sequence of the values in the result.
+ * @return A JSONArray of values.
+ * @throws JSONException If any of the values are non-finite numbers.
+ */
+ public JSONArray toJSONArray(JSONArray names) throws JSONException {
+ if (names == null || names.length() == 0) {
+ return null;
+ }
+ JSONArray ja = new JSONArray();
+ for (int i = 0; i < names.length(); i += 1) {
+ ja.put(this.opt(names.getString(i)));
+ }
+ return ja;
+ }
+
+ /**
+ * Make a JSON text of this JSONObject. For compactness, no whitespace
+ * is added. If this would not result in a syntactically correct JSON text,
+ * then null will be returned instead.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ *
+ * @return a printable, displayable, portable, transmittable
+ * representation of the object, beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ */
+ public String toString() {
+ try {
+ Iterator keys = keys();
+ StringBuffer sb = new StringBuffer("{");
+
+ while (keys.hasNext()) {
+ if (sb.length() > 1) {
+ sb.append(',');
+ }
+ Object o = keys.next();
+ sb.append(quote(o.toString()));
+ sb.append(':');
+ sb.append(valueToString(this.map.get(o)));
+ }
+ sb.append('}');
+ return sb.toString();
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+
+ /**
+ * Make a prettyprinted JSON text of this JSONObject.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param indentFactor The number of spaces to add to each level of
+ * indentation.
+ * @return a printable, displayable, portable, transmittable
+ * representation of the object, beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ * @throws JSONException If the object contains an invalid number.
+ */
+ public String toString(int indentFactor) throws JSONException {
+ return toString(indentFactor, 0);
+ }
+
+
+ /**
+ * Make a prettyprinted JSON text of this JSONObject.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param indentFactor The number of spaces to add to each level of
+ * indentation.
+ * @param indent The indentation of the top level.
+ * @return a printable, displayable, transmittable
+ * representation of the object, beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ * @throws JSONException If the object contains an invalid number.
+ */
+ String toString(int indentFactor, int indent) throws JSONException {
+ int j;
+ int n = length();
+ if (n == 0) {
+ return "{}";
+ }
+ Iterator keys = sortedKeys();
+ StringBuffer sb = new StringBuffer("{");
+ int newindent = indent + indentFactor;
+ Object o;
+ if (n == 1) {
+ o = keys.next();
+ sb.append(quote(o.toString()));
+ sb.append(": ");
+ sb.append(valueToString(this.map.get(o), indentFactor,
+ indent));
+ } else {
+ while (keys.hasNext()) {
+ o = keys.next();
+ if (sb.length() > 1) {
+ sb.append(",\n");
+ } else {
+ sb.append('\n');
+ }
+ for (j = 0; j < newindent; j += 1) {
+ sb.append(' ');
+ }
+ sb.append(quote(o.toString()));
+ sb.append(": ");
+ sb.append(valueToString(this.map.get(o), indentFactor,
+ newindent));
+ }
+ if (sb.length() > 1) {
+ sb.append('\n');
+ for (j = 0; j < indent; j += 1) {
+ sb.append(' ');
+ }
+ }
+ }
+ sb.append('}');
+ return sb.toString();
+ }
+
+
+ /**
+ * Make a JSON text of an Object value. If the object has an
+ * value.toJSONString() method, then that method will be used to produce
+ * the JSON text. The method is required to produce a strictly
+ * conforming text. If the object does not contain a toJSONString
+ * method (which is the most common case), then a text will be
+ * produced by other means. If the value is an array or Collection,
+ * then a JSONArray will be made from it and its toJSONString method
+ * will be called. If the value is a MAP, then a JSONObject will be made
+ * from it and its toJSONString method will be called. Otherwise, the
+ * value's toString method will be called, and the result will be quoted.
+ *
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param value The value to be serialized.
+ * @return a printable, displayable, transmittable
+ * representation of the object, beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ * @throws JSONException If the value is or contains an invalid number.
+ */
+ static String valueToString(Object value) throws JSONException {
+ if (value == null || value.equals(null)) {
+ return "null";
+ }
+ if (value instanceof JSONString) {
+ Object o;
+ try {
+ o = ((JSONString)value).toJSONString();
+ } catch (Exception e) {
+ throw new JSONException(e);
+ }
+ if (o instanceof String) {
+ return (String)o;
+ }
+ throw new JSONException("Bad value from toJSONString: " + o);
+ }
+ if (value instanceof Number) {
+ return numberToString((Number) value);
+ }
+ if (value instanceof Boolean || value instanceof JSONObject ||
+ value instanceof JSONArray) {
+ return value.toString();
+ }
+ if (value instanceof Map) {
+ return new JSONObject((Map)value).toString();
+ }
+ if (value instanceof Collection) {
+ return new JSONArray((Collection)value).toString();
+ }
+ if (value.getClass().isArray()) {
+ return new JSONArray(value).toString();
+ }
+ return quote(value.toString());
+ }
+
+
+ /**
+ * Make a prettyprinted JSON text of an object value.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ * @param value The value to be serialized.
+ * @param indentFactor The number of spaces to add to each level of
+ * indentation.
+ * @param indent The indentation of the top level.
+ * @return a printable, displayable, transmittable
+ * representation of the object, beginning
+ * with <code>{</code> <small>(left brace)</small> and ending
+ * with <code>}</code> <small>(right brace)</small>.
+ * @throws JSONException If the object contains an invalid number.
+ */
+ static String valueToString(Object value, int indentFactor, int indent)
+ throws JSONException {
+ if (value == null || value.equals(null)) {
+ return "null";
+ }
+ try {
+ if (value instanceof JSONString) {
+ Object o = ((JSONString)value).toJSONString();
+ if (o instanceof String) {
+ return (String)o;
+ }
+ }
+ } catch (Exception e) {
+ /* forget about it */
+ }
+ if (value instanceof Number) {
+ return numberToString((Number) value);
+ }
+ if (value instanceof Boolean) {
+ return value.toString();
+ }
+ if (value instanceof JSONObject) {
+ return ((JSONObject)value).toString(indentFactor, indent);
+ }
+ if (value instanceof JSONArray) {
+ return ((JSONArray)value).toString(indentFactor, indent);
+ }
+ if (value instanceof Map) {
+ return new JSONObject((Map)value).toString(indentFactor, indent);
+ }
+ if (value instanceof Collection) {
+ return new JSONArray((Collection)value).toString(indentFactor, indent);
+ }
+ if (value.getClass().isArray()) {
+ return new JSONArray(value).toString(indentFactor, indent);
+ }
+ return quote(value.toString());
+ }
+
+
+ /**
+ * Write the contents of the JSONObject as JSON text to a writer.
+ * For compactness, no whitespace is added.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ *
+ * @return The writer.
+ * @throws JSONException
+ */
+ public Writer write(Writer writer) throws JSONException {
+ try {
+ boolean b = false;
+ Iterator keys = keys();
+ writer.write('{');
+
+ while (keys.hasNext()) {
+ if (b) {
+ writer.write(',');
+ }
+ Object k = keys.next();
+ writer.write(quote(k.toString()));
+ writer.write(':');
+ Object v = this.map.get(k);
+ if (v instanceof JSONObject) {
+ ((JSONObject)v).write(writer);
+ } else if (v instanceof JSONArray) {
+ ((JSONArray)v).write(writer);
+ } else {
+ writer.write(valueToString(v));
+ }
+ b = true;
+ }
+ writer.write('}');
+ return writer;
+ } catch (IOException e) {
+ throw new JSONException(e);
+ }
+ }
+}
\ No newline at end of file
Added: trunk/java/org/apache/tomcat/util/json/JSONString.java
===================================================================
--- trunk/java/org/apache/tomcat/util/json/JSONString.java (rev 0)
+++ trunk/java/org/apache/tomcat/util/json/JSONString.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,18 @@
+package org.apache.tomcat.util.json;
+/**
+ * The <code>JSONString</code> interface allows a <code>toJSONString()</code>
+ * method so that a class can change the behavior of
+ * <code>JSONObject.toString()</code>, <code>JSONArray.toString()</code>,
+ * and <code>JSONWriter.value(</code>Object<code>)</code>. The
+ * <code>toJSONString</code> method will be used instead of the default behavior
+ * of using the Object's <code>toString()</code> method and quoting the result.
+ */
+public interface JSONString {
+ /**
+ * The <code>toJSONString</code> method allows a class to produce its own JSON
+ * serialization.
+ *
+ * @return A strictly syntactically correct JSON text.
+ */
+ public String toJSONString();
+}
Added: trunk/java/org/apache/tomcat/util/json/JSONStringer.java
===================================================================
--- trunk/java/org/apache/tomcat/util/json/JSONStringer.java (rev 0)
+++ trunk/java/org/apache/tomcat/util/json/JSONStringer.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,78 @@
+package org.apache.tomcat.util.json;
+
+/*
+Copyright (c) 2006 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+import java.io.StringWriter;
+
+/**
+ * JSONStringer provides a quick and convenient way of producing JSON text.
+ * The texts produced strictly conform to JSON syntax rules. No whitespace is
+ * added, so the results are ready for transmission or storage. Each instance of
+ * JSONStringer can produce one JSON text.
+ * <p>
+ * A JSONStringer instance provides a <code>value</code> method for appending
+ * values to the
+ * text, and a <code>key</code>
+ * method for adding keys before values in objects. There are <code>array</code>
+ * and <code>endArray</code> methods that make and bound array values, and
+ * <code>object</code> and <code>endObject</code> methods which make and bound
+ * object values. All of these methods return the JSONWriter instance,
+ * permitting cascade style. For example, <pre>
+ * myString = new JSONStringer()
+ * .object()
+ * .key("JSON")
+ * .value("Hello, World!")
+ * .endObject()
+ * .toString();</pre> which produces the string <pre>
+ * {"JSON":"Hello, World!"}</pre>
+ * <p>
+ * The first method called must be <code>array</code> or <code>object</code>.
+ * There are no methods for adding commas or colons. JSONStringer adds them for
+ * you. Objects and arrays can be nested up to 20 levels deep.
+ * <p>
+ * This can sometimes be easier than using a JSONObject to build a string.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONStringer extends JSONWriter {
+ /**
+ * Make a fresh JSONStringer. It can be used to build one JSON text.
+ */
+ public JSONStringer() {
+ super(new StringWriter());
+ }
+
+ /**
+ * Return the JSON text. This method is used to obtain the product of the
+ * JSONStringer instance. It will return <code>null</code> if there was a
+ * problem in the construction of the JSON text (such as the calls to
+ * <code>array</code> were not properly balanced with calls to
+ * <code>endArray</code>).
+ * @return The JSON text.
+ */
+ public String toString() {
+ return this.mode == 'd' ? this.writer.toString() : null;
+ }
+}
Added: trunk/java/org/apache/tomcat/util/json/JSONTokener.java
===================================================================
--- trunk/java/org/apache/tomcat/util/json/JSONTokener.java (rev 0)
+++ trunk/java/org/apache/tomcat/util/json/JSONTokener.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,422 @@
+package org.apache.tomcat.util.json;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+/**
+ * A JSONTokener takes a source string and extracts characters and tokens from
+ * it. It is used by the JSONObject and JSONArray constructors to parse
+ * JSON source strings.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONTokener {
+
+ private int index;
+ private Reader reader;
+ private char lastChar;
+ private boolean useLastChar;
+
+
+ /**
+ * Construct a JSONTokener from a string.
+ *
+ * @param reader A reader.
+ */
+ public JSONTokener(Reader reader) {
+ this.reader = reader.markSupported() ?
+ reader : new BufferedReader(reader);
+ this.useLastChar = false;
+ this.index = 0;
+ }
+
+
+ /**
+ * Construct a JSONTokener from a string.
+ *
+ * @param s A source string.
+ */
+ public JSONTokener(String s) {
+ this(new StringReader(s));
+ }
+
+
+ /**
+ * Back up one character. This provides a sort of lookahead capability,
+ * so that you can test for a digit or letter before attempting to parse
+ * the next number or identifier.
+ */
+ public void back() throws JSONException {
+ if (useLastChar || index <= 0) {
+ throw new JSONException("Stepping back two steps is not supported");
+ }
+ index -= 1;
+ useLastChar = true;
+ }
+
+
+
+ /**
+ * Get the hex value of a character (base16).
+ * @param c A character between '0' and '9' or between 'A' and 'F' or
+ * between 'a' and 'f'.
+ * @return An int between 0 and 15, or -1 if c was not a hex digit.
+ */
+ public static int dehexchar(char c) {
+ if (c >= '0' && c <= '9') {
+ return c - '0';
+ }
+ if (c >= 'A' && c <= 'F') {
+ return c - ('A' - 10);
+ }
+ if (c >= 'a' && c <= 'f') {
+ return c - ('a' - 10);
+ }
+ return -1;
+ }
+
+
+ /**
+ * Determine if the source string still contains characters that next()
+ * can consume.
+ * @return true if not yet at the end of the source.
+ */
+ public boolean more() throws JSONException {
+ char nextChar = next();
+ if (nextChar == 0) {
+ return false;
+ }
+ back();
+ return true;
+ }
+
+
+ /**
+ * Get the next character in the source string.
+ *
+ * @return The next character, or 0 if past the end of the source string.
+ */
+ public char next() throws JSONException {
+ if (this.useLastChar) {
+ this.useLastChar = false;
+ if (this.lastChar != 0) {
+ this.index += 1;
+ }
+ return this.lastChar;
+ }
+ int c;
+ try {
+ c = this.reader.read();
+ } catch (IOException exc) {
+ throw new JSONException(exc);
+ }
+
+ if (c <= 0) { // End of stream
+ this.lastChar = 0;
+ return 0;
+ }
+ this.index += 1;
+ this.lastChar = (char) c;
+ return this.lastChar;
+ }
+
+
+ /**
+ * Consume the next character, and check that it matches a specified
+ * character.
+ * @param c The character to match.
+ * @return The character.
+ * @throws JSONException if the character does not match.
+ */
+ public char next(char c) throws JSONException {
+ char n = next();
+ if (n != c) {
+ throw syntaxError("Expected '" + c + "' and instead saw '" +
+ n + "'");
+ }
+ return n;
+ }
+
+
+ /**
+ * Get the next n characters.
+ *
+ * @param n The number of characters to take.
+ * @return A string of n characters.
+ * @throws JSONException
+ * Substring bounds error if there are not
+ * n characters remaining in the source string.
+ */
+ public String next(int n) throws JSONException {
+ if (n == 0) {
+ return "";
+ }
+
+ char[] buffer = new char[n];
+ int pos = 0;
+
+ if (this.useLastChar) {
+ this.useLastChar = false;
+ buffer[0] = this.lastChar;
+ pos = 1;
+ }
+
+ try {
+ int len;
+ while ((pos < n) && ((len = reader.read(buffer, pos, n - pos)) != -1)) {
+ pos += len;
+ }
+ } catch (IOException exc) {
+ throw new JSONException(exc);
+ }
+ this.index += pos;
+
+ if (pos < n) {
+ throw syntaxError("Substring bounds error");
+ }
+
+ this.lastChar = buffer[n - 1];
+ return new String(buffer);
+ }
+
+
+ /**
+ * Get the next char in the string, skipping whitespace.
+ * @throws JSONException
+ * @return A character, or 0 if there are no more characters.
+ */
+ public char nextClean() throws JSONException {
+ for (;;) {
+ char c = next();
+ if (c == 0 || c > ' ') {
+ return c;
+ }
+ }
+ }
+
+
+ /**
+ * Return the characters up to the next close quote character.
+ * Backslash processing is done. The formal JSON format does not
+ * allow strings in single quotes, but an implementation is allowed to
+ * accept them.
+ * @param quote The quoting character, either
+ * <code>"</code> <small>(double quote)</small> or
+ * <code>'</code> <small>(single quote)</small>.
+ * @return A String.
+ * @throws JSONException Unterminated string.
+ */
+ public String nextString(char quote) throws JSONException {
+ char c;
+ StringBuffer sb = new StringBuffer();
+ for (;;) {
+ c = next();
+ switch (c) {
+ case 0:
+ case '\n':
+ case '\r':
+ throw syntaxError("Unterminated string");
+ case '\\':
+ c = next();
+ switch (c) {
+ case 'b':
+ sb.append('\b');
+ break;
+ case 't':
+ sb.append('\t');
+ break;
+ case 'n':
+ sb.append('\n');
+ break;
+ case 'f':
+ sb.append('\f');
+ break;
+ case 'r':
+ sb.append('\r');
+ break;
+ case 'u':
+ sb.append((char)Integer.parseInt(next(4), 16));
+ break;
+ case 'x' :
+ sb.append((char) Integer.parseInt(next(2), 16));
+ break;
+ default:
+ sb.append(c);
+ }
+ break;
+ default:
+ if (c == quote) {
+ return sb.toString();
+ }
+ sb.append(c);
+ }
+ }
+ }
+
+
+ /**
+ * Get the text up but not including the specified character or the
+ * end of line, whichever comes first.
+ * @param d A delimiter character.
+ * @return A string.
+ */
+ public String nextTo(char d) throws JSONException {
+ StringBuffer sb = new StringBuffer();
+ for (;;) {
+ char c = next();
+ if (c == d || c == 0 || c == '\n' || c == '\r') {
+ if (c != 0) {
+ back();
+ }
+ return sb.toString().trim();
+ }
+ sb.append(c);
+ }
+ }
+
+
+ /**
+ * Get the text up but not including one of the specified delimiter
+ * characters or the end of line, whichever comes first.
+ * @param delimiters A set of delimiter characters.
+ * @return A string, trimmed.
+ */
+ public String nextTo(String delimiters) throws JSONException {
+ char c;
+ StringBuffer sb = new StringBuffer();
+ for (;;) {
+ c = next();
+ if (delimiters.indexOf(c) >= 0 || c == 0 ||
+ c == '\n' || c == '\r') {
+ if (c != 0) {
+ back();
+ }
+ return sb.toString().trim();
+ }
+ sb.append(c);
+ }
+ }
+
+
+ /**
+ * Get the next value. The value can be a Boolean, Double, Integer,
+ * JSONArray, JSONObject, Long, or String, or the JSONObject.NULL object.
+ * @throws JSONException If syntax error.
+ *
+ * @return An object.
+ */
+ public Object nextValue() throws JSONException {
+ char c = nextClean();
+ String s;
+
+ switch (c) {
+ case '"':
+ case '\'':
+ return nextString(c);
+ case '{':
+ back();
+ return new JSONObject(this);
+ case '[':
+ case '(':
+ back();
+ return new JSONArray(this);
+ }
+
+ /*
+ * Handle unquoted text. This could be the values true, false, or
+ * null, or it can be a number. An implementation (such as this one)
+ * is allowed to also accept non-standard forms.
+ *
+ * Accumulate characters until we reach the end of the text or a
+ * formatting character.
+ */
+
+ StringBuffer sb = new StringBuffer();
+ while (c >= ' ' && ",:]}/\\\"[{;=#".indexOf(c) < 0) {
+ sb.append(c);
+ c = next();
+ }
+ back();
+
+ s = sb.toString().trim();
+ if (s.equals("")) {
+ throw syntaxError("Missing value");
+ }
+ return JSONObject.stringToValue(s);
+ }
+
+
+ /**
+ * Skip characters until the next character is the requested character.
+ * If the requested character is not found, no characters are skipped.
+ * @param to A character to skip to.
+ * @return The requested character, or zero if the requested character
+ * is not found.
+ */
+ public char skipTo(char to) throws JSONException {
+ char c;
+ try {
+ int startIndex = this.index;
+ reader.mark(Integer.MAX_VALUE);
+ do {
+ c = next();
+ if (c == 0) {
+ reader.reset();
+ this.index = startIndex;
+ return c;
+ }
+ } while (c != to);
+ } catch (IOException exc) {
+ throw new JSONException(exc);
+ }
+
+ back();
+ return c;
+ }
+
+ /**
+ * Make a JSONException to signal a syntax error.
+ *
+ * @param message The error message.
+ * @return A JSONException object, suitable for throwing
+ */
+ public JSONException syntaxError(String message) {
+ return new JSONException(message + toString());
+ }
+
+
+ /**
+ * Make a printable string of this JSONTokener.
+ *
+ * @return " at character [this.index]"
+ */
+ public String toString() {
+ return " at character " + index;
+ }
+}
\ No newline at end of file
Added: trunk/java/org/apache/tomcat/util/json/JSONWriter.java
===================================================================
--- trunk/java/org/apache/tomcat/util/json/JSONWriter.java (rev 0)
+++ trunk/java/org/apache/tomcat/util/json/JSONWriter.java 2008-09-19 01:53:57 UTC (rev 784)
@@ -0,0 +1,323 @@
+package org.apache.tomcat.util.json;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/*
+Copyright (c) 2006 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+/**
+ * JSONWriter provides a quick and convenient way of producing JSON text.
+ * The texts produced strictly conform to JSON syntax rules. No whitespace is
+ * added, so the results are ready for transmission or storage. Each instance of
+ * JSONWriter can produce one JSON text.
+ * <p>
+ * A JSONWriter instance provides a <code>value</code> method for appending
+ * values to the
+ * text, and a <code>key</code>
+ * method for adding keys before values in objects. There are <code>array</code>
+ * and <code>endArray</code> methods that make and bound array values, and
+ * <code>object</code> and <code>endObject</code> methods which make and bound
+ * object values. All of these methods return the JSONWriter instance,
+ * permitting a cascade style. For example, <pre>
+ * new JSONWriter(myWriter)
+ * .object()
+ * .key("JSON")
+ * .value("Hello, World!")
+ * .endObject();</pre> which writes <pre>
+ * {"JSON":"Hello, World!"}</pre>
+ * <p>
+ * The first method called must be <code>array</code> or <code>object</code>.
+ * There are no methods for adding commas or colons. JSONWriter adds them for
+ * you. Objects and arrays can be nested up to 20 levels deep.
+ * <p>
+ * This can sometimes be easier than using a JSONObject to build a string.
+ * @author JSON.org
+ * @version 2008-09-18
+ */
+public class JSONWriter {
+ private static final int maxdepth = 20;
+
+ /**
+ * The comma flag determines if a comma should be output before the next
+ * value.
+ */
+ private boolean comma;
+
+ /**
+ * The current mode. Values:
+ * 'a' (array),
+ * 'd' (done),
+ * 'i' (initial),
+ * 'k' (key),
+ * 'o' (object).
+ */
+ protected char mode;
+
+ /**
+ * The object/array stack.
+ */
+ private JSONObject stack[];
+
+ /**
+ * The stack top index. A value of 0 indicates that the stack is empty.
+ */
+ private int top;
+
+ /**
+ * The writer that will receive the output.
+ */
+ protected Writer writer;
+
+ /**
+ * Make a fresh JSONWriter. It can be used to build one JSON text.
+ */
+ public JSONWriter(Writer w) {
+ this.comma = false;
+ this.mode = 'i';
+ this.stack = new JSONObject[maxdepth];
+ this.top = 0;
+ this.writer = w;
+ }
+
+ /**
+ * Append a value.
+ * @param s A string value.
+ * @return this
+ * @throws JSONException If the value is out of sequence.
+ */
+ private JSONWriter append(String s) throws JSONException {
+ if (s == null) {
+ throw new JSONException("Null pointer");
+ }
+ if (this.mode == 'o' || this.mode == 'a') {
+ try {
+ if (this.comma && this.mode == 'a') {
+ this.writer.write(',');
+ }
+ this.writer.write(s);
+ } catch (IOException e) {
+ throw new JSONException(e);
+ }
+ if (this.mode == 'o') {
+ this.mode = 'k';
+ }
+ this.comma = true;
+ return this;
+ }
+ throw new JSONException("Value out of sequence.");
+ }
+
+ /**
+ * Begin appending a new array. All values until the balancing
+ * <code>endArray</code> will be appended to this array. The
+ * <code>endArray</code> method must be called to mark the array's end.
+ * @return this
+ * @throws JSONException If the nesting is too deep, or if the object is
+ * started in the wrong place (for example as a key or after the end of the
+ * outermost array or object).
+ */
+ public JSONWriter array() throws JSONException {
+ if (this.mode == 'i' || this.mode == 'o' || this.mode == 'a') {
+ this.push(null);
+ this.append("[");
+ this.comma = false;
+ return this;
+ }
+ throw new JSONException("Misplaced array.");
+ }
+
+ /**
+ * End something.
+ * @param m Mode
+ * @param c Closing character
+ * @return this
+ * @throws JSONException If unbalanced.
+ */
+ private JSONWriter end(char m, char c) throws JSONException {
+ if (this.mode != m) {
+ throw new JSONException(m == 'o' ? "Misplaced endObject." :
+ "Misplaced endArray.");
+ }
+ this.pop(m);
+ try {
+ this.writer.write(c);
+ } catch (IOException e) {
+ throw new JSONException(e);
+ }
+ this.comma = true;
+ return this;
+ }
+
+ /**
+ * End an array. This method most be called to balance calls to
+ * <code>array</code>.
+ * @return this
+ * @throws JSONException If incorrectly nested.
+ */
+ public JSONWriter endArray() throws JSONException {
+ return this.end('a', ']');
+ }
+
+ /**
+ * End an object. This method most be called to balance calls to
+ * <code>object</code>.
+ * @return this
+ * @throws JSONException If incorrectly nested.
+ */
+ public JSONWriter endObject() throws JSONException {
+ return this.end('k', '}');
+ }
+
+ /**
+ * Append a key. The key will be associated with the next value. In an
+ * object, every value must be preceded by a key.
+ * @param s A key string.
+ * @return this
+ * @throws JSONException If the key is out of place. For example, keys
+ * do not belong in arrays or if the key is null.
+ */
+ public JSONWriter key(String s) throws JSONException {
+ if (s == null) {
+ throw new JSONException("Null key.");
+ }
+ if (this.mode == 'k') {
+ try {
+ if (this.comma) {
+ this.writer.write(',');
+ }
+ stack[top - 1].putOnce(s, Boolean.TRUE);
+ this.writer.write(JSONObject.quote(s));
+ this.writer.write(':');
+ this.comma = false;
+ this.mode = 'o';
+ return this;
+ } catch (IOException e) {
+ throw new JSONException(e);
+ }
+ }
+ throw new JSONException("Misplaced key.");
+ }
+
+
+ /**
+ * Begin appending a new object. All keys and values until the balancing
+ * <code>endObject</code> will be appended to this object. The
+ * <code>endObject</code> method must be called to mark the object's end.
+ * @return this
+ * @throws JSONException If the nesting is too deep, or if the object is
+ * started in the wrong place (for example as a key or after the end of the
+ * outermost array or object).
+ */
+ public JSONWriter object() throws JSONException {
+ if (this.mode == 'i') {
+ this.mode = 'o';
+ }
+ if (this.mode == 'o' || this.mode == 'a') {
+ this.append("{");
+ this.push(new JSONObject());
+ this.comma = false;
+ return this;
+ }
+ throw new JSONException("Misplaced object.");
+
+ }
+
+
+ /**
+ * Pop an array or object scope.
+ * @param c The scope to close.
+ * @throws JSONException If nesting is wrong.
+ */
+ private void pop(char c) throws JSONException {
+ if (this.top <= 0) {
+ throw new JSONException("Nesting error.");
+ }
+ char m = this.stack[this.top - 1] == null ? 'a' : 'k';
+ if (m != c) {
+ throw new JSONException("Nesting error.");
+ }
+ this.top -= 1;
+ this.mode = this.top == 0 ? 'd' : this.stack[this.top - 1] == null ? 'a' : 'k';
+ }
+
+ /**
+ * Push an array or object scope.
+ * @param c The scope to open.
+ * @throws JSONException If nesting is too deep.
+ */
+ private void push(JSONObject jo) throws JSONException {
+ if (this.top >= maxdepth) {
+ throw new JSONException("Nesting too deep.");
+ }
+ this.stack[this.top] = jo;
+ this.mode = jo == null ? 'a' : 'k';
+ this.top += 1;
+ }
+
+
+ /**
+ * Append either the value <code>true</code> or the value
+ * <code>false</code>.
+ * @param b A boolean.
+ * @return this
+ * @throws JSONException
+ */
+ public JSONWriter value(boolean b) throws JSONException {
+ return this.append(b ? "true" : "false");
+ }
+
+ /**
+ * Append a double value.
+ * @param d A double.
+ * @return this
+ * @throws JSONException If the number is not finite.
+ */
+ public JSONWriter value(double d) throws JSONException {
+ return this.value(new Double(d));
+ }
+
+ /**
+ * Append a long value.
+ * @param l A long.
+ * @return this
+ * @throws JSONException
+ */
+ public JSONWriter value(long l) throws JSONException {
+ return this.append(Long.toString(l));
+ }
+
+
+ /**
+ * Append an object value.
+ * @param o The object to append. It can be null, or a Boolean, Number,
+ * String, JSONObject, or JSONArray, or an object with a toJSONString()
+ * method.
+ * @return this
+ * @throws JSONException If the value is out of sequence.
+ */
+ public JSONWriter value(Object o) throws JSONException {
+ return this.append(JSONObject.valueToString(o));
+ }
+}
Modified: trunk/webapps/docs/changelog.xml
===================================================================
--- trunk/webapps/docs/changelog.xml 2008-09-18 15:57:52 UTC (rev 783)
+++ trunk/webapps/docs/changelog.xml 2008-09-19 01:53:57 UTC (rev 784)
@@ -31,10 +31,16 @@
<fix>
<bug>45419</bug>: Set Accept-Ranges for static resources served by DefaultServlet. (markt)
</fix>
+ <add>
+ Bayeux support using a BayeuxServlet written as an event driven servlet. (remm, fhanik)
+ </add>
</changelog>
</subsection>
<subsection name="Coyote">
<changelog>
+ <add>
+ Package renamed JSON library. (remm)
+ </add>
</changelog>
</subsection>
<subsection name="Jasper">
16 years, 5 months
JBossWeb SVN: r783 - in trunk: webapps/docs and 1 other directory.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2008-09-18 11:57:52 -0400 (Thu, 18 Sep 2008)
New Revision: 783
Modified:
trunk/java/org/apache/catalina/servlets/DefaultServlet.java
trunk/webapps/docs/changelog.xml
trunk/webapps/docs/default-servlet.xml
Log:
- Add advertise accept ranges. Acro Reader (at least some versions of it) need that supposedly, although it is optional.
Modified: trunk/java/org/apache/catalina/servlets/DefaultServlet.java
===================================================================
--- trunk/java/org/apache/catalina/servlets/DefaultServlet.java 2008-09-17 15:56:37 UTC (rev 782)
+++ trunk/java/org/apache/catalina/servlets/DefaultServlet.java 2008-09-18 15:57:52 UTC (rev 783)
@@ -156,6 +156,12 @@
/**
+ * Should the Accept-Ranges: bytes header be send with static resources?
+ */
+ protected boolean useAcceptRanges = true;
+
+
+ /**
* Full range marker.
*/
protected static ArrayList FULL = new ArrayList();
@@ -241,6 +247,9 @@
localXsltFile = getServletConfig().getInitParameter("localXsltFile");
readmeFile = getServletConfig().getInitParameter("readmeFile");
+ if (getServletConfig().getInitParameter("useAcceptRanges") != null)
+ useAcceptRanges = Boolean.parseBoolean(getServletConfig().getInitParameter("useAcceptRanges"));
+
// Sanity check on the specified buffer sizes
if (input < 256)
input = 256;
@@ -718,6 +727,11 @@
} else {
+ if (useAcceptRanges) {
+ // Accept ranges header
+ response.setHeader("Accept-Ranges", "bytes");
+ }
+
// Parse range specifier
ranges = parseRange(request, response, cacheEntry.attributes);
Modified: trunk/webapps/docs/changelog.xml
===================================================================
--- trunk/webapps/docs/changelog.xml 2008-09-17 15:56:37 UTC (rev 782)
+++ trunk/webapps/docs/changelog.xml 2008-09-18 15:57:52 UTC (rev 783)
@@ -28,6 +28,9 @@
<fix>
<bug>45441</bug>: Correctly map filters for FORWARD and INCLUDE. (remm)
</fix>
+ <fix>
+ <bug>45419</bug>: Set Accept-Ranges for static resources served by DefaultServlet. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
Modified: trunk/webapps/docs/default-servlet.xml
===================================================================
--- trunk/webapps/docs/default-servlet.xml 2008-09-17 15:56:37 UTC (rev 782)
+++ trunk/webapps/docs/default-servlet.xml 2008-09-18 15:57:52 UTC (rev 783)
@@ -144,6 +144,11 @@
to always disable sendfile. [48]</p>
</attribute>
+ <attribute name="useAcceptRanges" required="false">
+ <p>If true, the Accept-Ranges header will be set when appropriate for the
+ response. [true]</p>
+ </attribute>
+
</attributes>
</section>
16 years, 5 months
JBossWeb SVN: r781 - in trunk: webapps/docs and 1 other directory.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2008-09-17 09:55:42 -0400 (Wed, 17 Sep 2008)
New Revision: 781
Modified:
trunk/java/org/apache/jasper/compiler/Parser.java
trunk/webapps/docs/changelog.xml
Log:
- Port quote parsing fix.
Modified: trunk/java/org/apache/jasper/compiler/Parser.java
===================================================================
--- trunk/java/org/apache/jasper/compiler/Parser.java 2008-09-17 12:27:14 UTC (rev 780)
+++ trunk/java/org/apache/jasper/compiler/Parser.java 2008-09-17 13:55:42 UTC (rev 781)
@@ -771,9 +771,9 @@
}
if (currentChar == -1)
err.jspError(start, "jsp.error.unterminated", type + "{");
- if (currentChar == '"')
+ if (currentChar == '"' && !singleQuoted)
doubleQuoted = !doubleQuoted;
- if (currentChar == '\'')
+ if (currentChar == '\'' && !doubleQuoted)
singleQuoted = !singleQuoted;
} while (currentChar != '}' || (singleQuoted || doubleQuoted));
Modified: trunk/webapps/docs/changelog.xml
===================================================================
--- trunk/webapps/docs/changelog.xml 2008-09-17 12:27:14 UTC (rev 780)
+++ trunk/webapps/docs/changelog.xml 2008-09-17 13:55:42 UTC (rev 781)
@@ -36,6 +36,9 @@
</subsection>
<subsection name="Jasper">
<changelog>
+ <fix>
+ <bug>45427</bug>: Correct parsing of quoted stings in EL. (markt)
+ </fix>
</changelog>
</subsection>
</section>
16 years, 5 months
JBossWeb SVN: r780 - in trunk: webapps/docs and 1 other directory.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2008-09-17 08:27:14 -0400 (Wed, 17 Sep 2008)
New Revision: 780
Modified:
trunk/java/org/apache/catalina/core/ApplicationContext.java
trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
trunk/webapps/docs/changelog.xml
Log:
- Different take on Tomcat's patch to fix filters mapping in dispatchers.
Modified: trunk/java/org/apache/catalina/core/ApplicationContext.java
===================================================================
--- trunk/java/org/apache/catalina/core/ApplicationContext.java 2008-09-17 12:26:33 UTC (rev 779)
+++ trunk/java/org/apache/catalina/core/ApplicationContext.java 2008-09-17 12:27:14 UTC (rev 780)
@@ -327,7 +327,7 @@
if (wrapper == null)
return (null);
- return new ApplicationDispatcher(wrapper, null, null, null, null, name);
+ return new ApplicationDispatcher(wrapper, null, null, null, null, null, name);
}
@@ -429,6 +429,7 @@
}
Wrapper wrapper = (Wrapper) mappingData.wrapper;
+ String requestPath = mappingData.requestPath.toString();
String wrapperPath = mappingData.wrapperPath.toString();
String pathInfo = mappingData.pathInfo.toString();
@@ -436,7 +437,7 @@
// Construct a RequestDispatcher to process this request
return new ApplicationDispatcher
- (wrapper, uriCC.toString(), wrapperPath, pathInfo,
+ (wrapper, uriCC.toString(), requestPath, wrapperPath, pathInfo,
queryString, null);
}
Modified: trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
===================================================================
--- trunk/java/org/apache/catalina/core/ApplicationDispatcher.java 2008-09-17 12:26:33 UTC (rev 779)
+++ trunk/java/org/apache/catalina/core/ApplicationDispatcher.java 2008-09-17 12:27:14 UTC (rev 780)
@@ -162,6 +162,7 @@
* @param wrapper The Wrapper associated with the resource that will
* be forwarded to or included (required)
* @param requestURI The request URI to this resource (if any)
+ * @param requestPath The revised path to this resource, relative to the context (if any)
* @param servletPath The revised servlet path to this resource (if any)
* @param pathInfo The revised extra path information to this resource
* (if any)
@@ -171,7 +172,7 @@
* else <code>null</code>
*/
public ApplicationDispatcher
- (Wrapper wrapper, String requestURI, String servletPath,
+ (Wrapper wrapper, String requestURI, String requestPath, String servletPath,
String pathInfo, String queryString, String name) {
super();
@@ -180,6 +181,7 @@
this.wrapper = wrapper;
this.context = (Context) wrapper.getParent();
this.requestURI = requestURI;
+ this.requestPath = requestPath;
this.servletPath = servletPath;
this.pathInfo = pathInfo;
this.queryString = queryString;
@@ -226,6 +228,12 @@
/**
+ * The request path for this RequestDispatcher.
+ */
+ private String requestPath = null;
+
+
+ /**
* The request URI for this RequestDispatcher.
*/
private String requestURI = null;
@@ -429,7 +437,7 @@
if (disInt.intValue() != ApplicationFilterFactory.ERROR) {
state.outerRequest.setAttribute
(ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
- servletPath);
+ requestPath);
state.outerRequest.setAttribute
(ApplicationFilterFactory.DISPATCHER_TYPE_ATTR,
Integer.valueOf(ApplicationFilterFactory.FORWARD));
@@ -499,7 +507,7 @@
Integer.valueOf(ApplicationFilterFactory.INCLUDE));
wrequest.setAttribute(
ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
- servletPath);
+ requestPath);
invoke(state.outerRequest, state.outerResponse, state);
}
@@ -531,7 +539,7 @@
Integer.valueOf(ApplicationFilterFactory.INCLUDE));
wrequest.setAttribute(
ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
- servletPath);
+ requestPath);
invoke(state.outerRequest, state.outerResponse, state);
}
Modified: trunk/webapps/docs/changelog.xml
===================================================================
--- trunk/webapps/docs/changelog.xml 2008-09-17 12:26:33 UTC (rev 779)
+++ trunk/webapps/docs/changelog.xml 2008-09-17 12:27:14 UTC (rev 780)
@@ -19,7 +19,15 @@
<section name="JBoss Web 2.1.1.GA (remm)">
<subsection name="Catalina">
<changelog>
- <bug>45785</bug>: Add a check in the loader in addition to the fix for JBAS-4965. (markt)
+ <fix>
+ <bug>45785</bug>: Add a check in the loader in addition to the fix for JBAS-4965. (markt)
+ </fix>
+ <fix>
+ <bug>45823</bug>: Log missing request headers as - not null. Based on a patch by Per Landberg. (markt)
+ </fix>
+ <fix>
+ <bug>45441</bug>: Correctly map filters for FORWARD and INCLUDE. (remm)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
16 years, 5 months
JBossWeb SVN: r779 - trunk/java/org/apache/catalina/valves.
by jbossweb-commits@lists.jboss.org
Author: remy.maucherat(a)jboss.com
Date: 2008-09-17 08:26:33 -0400 (Wed, 17 Sep 2008)
New Revision: 779
Modified:
trunk/java/org/apache/catalina/valves/AccessLogValve.java
Log:
- Fix access log format for null headers. Oops.
Modified: trunk/java/org/apache/catalina/valves/AccessLogValve.java
===================================================================
--- trunk/java/org/apache/catalina/valves/AccessLogValve.java 2008-09-15 12:59:10 UTC (rev 778)
+++ trunk/java/org/apache/catalina/valves/AccessLogValve.java 2008-09-17 12:26:33 UTC (rev 779)
@@ -1237,7 +1237,12 @@
public void addElement(StringBuffer buf, Date date, Request request,
Response response, long time) {
- buf.append(request.getHeader(header));
+ String value = request.getHeader(header);
+ if (value == null) {
+ buf.append('-');
+ } else {
+ buf.append(value);
+ }
}
}
16 years, 5 months