Sistemas adaptables, reflectivos y separación de...
Transcript of Sistemas adaptables, reflectivos y separación de...
Sistemas adaptables, reflectivos y separación de aspectos
Lourdes Tajes MartínezOctubre - 2003
Programa de DoctoradoDepartamento de Informática
1
Tabla de contenidos
• Introducción• La programación orientada a aspectos• Lenguajes de Programación orientados a aspectos• El lenguaje AspectJ• Ejemplos• Taller
2
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
3
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
El problema de la metodología tradicionalIntroducción
1. Primeras etapas• Los programas se escriben directamente en código máquina• Los programadores pasan más tiempo pensando en un conjunto particular
de instrucciones máquina que en el problema en sí2. Código espagueti
• Aparecen los lenguajes de alto nivel• Cierto nivel de abstracción de la máquina subyacente• No existe separación de conceptos, datos y funcionalidad
3. Descomposición funcional• Descompone los problemas en términos de los procedimientos necesarios
para llevar a cabo las tareas4. Programación Orientada a objetos
• Se ve el sistema como un conjunto de objetos que colaboran• Las clases permiten ocultar los detalles de implantación tras las interfaces• El polimorfismo proporciona un comportamiento e interfaz común para
conceptos relacionados y permite a componentes más especializados cambiar un comportamiento particular sin acceder a la implementación
• Maneja mejor los sistemas complejos: Es fácil integrar nuevos datos, pero las funciones se esparcen por todo el código
• Con frecuencia, para integrar nuevas funciones, hay que modificar varios objetos → se enmarañan los objetos en funciones de alto nivel que involucran a varias clases
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
4
El problema de la metodología tradicionalIntroducción
1ª Generación
2ª / 3ª Generación
4ª Generación
• Software = Datos(formas) + Funciones (colores)• Cada generación permite una correspondencia más natural de los
requerimientos del sistema con los constructores de programación
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
5
• Un sistema complejo se puede ver como una implantación combinada de múltiples aspectos, asuntos, incumbencias, ...
– Asuntos del nivel base (Core level concerns): La lógica de negocio del sistema
– Asuntos de nivel sistema (System level concerns)• Tienden a ser ortogonales entre sí y con los requerimientos básicos• Crosscutting concerns: Tienden a afectar/interferir entre sí y con
varios módulos base.• Rendimiento, persistencia, logging, depurado, autenticación,
seguridad, multihilo, chequeo de errores,...
• Las descomposiciones tradicionales no plantean ningún problema con respecto al diseño y la implantación de la funcionalidad básica
• PERO no aíslan bien los asuntos especiales, que quedan dispersos por todo el sistema, enmarañando el código que implanta la funcionalidad básica y perjudicando la claridad del mismo
– Ejemplo. Persistencia: La gestión del almacenamiento afecta a cualquier objeto con estado.
El sistema como un conjunto de incumbenciasIntroducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
6
El sistema como un conjunto de incumbenciasIntroducción
Módulos de la implantacióndel sistema
Seguridad Logging
PersistenciaTabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
7
El sistema como un conjunto de incumbenciasIntroducción
• Aproximaciones tradicionales– Tratar en el mismo código y con el mismo lenguaje de
programación los asuntos básicos y los asuntos ortogonales.
• Ejemplo: Procesamiento de una tarjeta de crédito– Funcionalidad básica
• El procesamiento de los pagos– Resta una cantidad de una cuenta bancaria
– Funcionalidad ortogonal• Logging• Integridad de la transacción• Autenticación• Seguridad• Rendimiento
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
8
Ejemplo: la tarjeta de créditoIntroducción
public class TarjetadeCréditoClass extends TarjetaClass {// Core data members// Other data members: Log stream, data-consistency
flag
// Override methods in the base classpublic void performSomeOperation(OperationInformation info) {// Ensure authentication// Ensure info satisfies contracts// Lock the object to ensure data-consistency in case other threads access it// Ensure the cache is up to date// Log the start of operation
// ==== Perform the core operation ====
// Log the completion of operation// Unlock the object
}
// More operations similar to above
public void save(PersitanceStorage ps) { }public void load(PersitanceStorage ps) { }}
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
9
• Otra aproximación tradicional para tratar los aspectos ortogonales ha sido extender un lenguaje determinado añadiendo unos poco constructores para gestionar el aspecto en cuestión
• Ejemplo: DROL (Distributed Real-time Object Language)– Extensión de C++ con la capacidad añadida de describir
sistemas en tiempo real distribuidos– Para ello, DROL añade palabras clave como deadline(time),
timeout(time), period(time), within(time),....– El código resultante de añadir estos constructores al lenguaje
intercala sentencias referidas a distintos asuntos• Ejemplo: Implantación del método Insert en una cola
limitada usando C++ y la librería de hilos pthread. El método intercala código de sincronización con el algoritmo básico
El sistema como un conjunto de incumbenciasIntroducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
10
void BoundedQueue::Insert(Element *e) {// Sincronización
Pthread_mutex_lock(&qlock_insert);while(nelements==MAX) {cout<<pthread_self() << “Esperando”;Pthread_cond_wait(&q_notfull, &qlock_insert);}
// Fin sincronizaciónbuf[head]=el;head=(head+1)%MAX;nelements++;
//SincronizaciónPthread_cond_signal(&q_notempty);Pthread_mutex_unlock(&qlock_insert);
//Fin Sincronización}
El sistema como un conjunto de incumbenciasIntroducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
11
• Las incumbencias ortogonales se dispersan por varias dimensiones pero las técnicas de implantación actuales obligan aimplantarlas en el ámbito del problema base
• Resultado: Es difícil establecer una correspondencia entre los requerimientos y la implantación
• Síntomas de una implantación problemática– Código enredado (code tangling)
• Los objetos base interactúan simultáneamente con varios asuntos técnicos
• Presencia simultánea de elementos de la implantación de cada incumbencia en el código
– Código disperso (code scattering)• Dado que por definición, las incumbencias ortogonales, se dispersan por
varios objetos, su implantación también.• Ejemplo: un sistema que utiliza una base de datos, el rendimiento puede
afectar a todos los objetos que acceden a la base de datos.
• Ambos problemas (S&T) tienden a aparecer juntos ya que describen diferentes facetas del mismo problema
• No son específicos de la AOP
Problemas derivados de la mezcla de incumbenciasIntroducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
12
• S&T ⇒ Falta de modularidad.• Ejemplos reales como la vida misma1. Parsing XML en org.apache.tomcat
– En rojo las líneas de código relevantes
Problemas derivados de la mezcla de incumbenciasIntroducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
13
2. Análisis de patrones/direcciones URL– En rojo las líneas de código relevantes
Problemas derivados de la mezcla de incumbenciasIntroducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
14
3. Logging no modular– Ejemplo: logging en org.apache.tomcat no modular
• El color rojo muestra las líneas de código que gestionan el logging• No se encuentran en un único sitio• Ni siquiera en un pequeño número de módulos
Problemas derivados de la mezcla de incumbenciasIntroducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
15
4. Finalización de las sesiones no modular
Problemas derivados de la mezcla de incumbenciasIntroducción
/ ** = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*
* T h e A p a c h e S o f t w a r e L i c e n s e , V e r s i o n 1 . 1*
* C o p y r i g h t ( c ) 1 9 9 9 T h e A p a c h e S o f t w a r e F o u n d a t i o n . A l l r i g h t s
* r e s e r v e d .*
* R e d i s t r i b u t i o n a n d u s e i n s o u r c e a n d b i n a r y f o r m s , w i t h o r w i thout
* m o d i f i c a t i o n , a r e p e r m i t t e d p r o v i d e d t h a t t h e f o l l o w i n g c o n d i tions* a r e m e t :
*
* 1 . R e d i s t r i b u t i o n s o f s o u r c e c o d e m u s t r e t a i n t h e a b o v e c o p y r i g h t* n o t i c e , t h i s l i s t o f c o n d i t i o n s a n d t h e f o l l o w i n g d i s c l a i m e r .
*
* 2 . R e d i s t r i b u t i o n s i n b i n a r y f o r m m u s t r e p r o d u c e t h e a b o v e c o p y r i g h t* n o t i c e , t h i s l i s t o f c o n d i t i o n s a n d t h e f o l l o w i n g d i s c l a i m er in
* t h e d o c u m e n t a t i o n a n d / o r o t h e r m a t e r i a l s p r o v i d e d w i t h t h e
* d i s t r i b u t i o n .*
* 3 . T h e e n d -u s e r d o c u m e n t a t i o n i n c l u d e d w i t h t h e r e d i s t r i b u t i o n , i f
* a n y , m u s t i n c l u d e t h e f o l l o w i n g a c k n o w l e g e m e n t :* " T h i s p r o d u c t i n c l u d e s s o f t w a r e d e v e l o p e d b y t h e
* A p a c h e S o f t w a r e F o u n d a t i o n ( h t t p : / / w w w . a p a c h e . o r g / ) . "
* A l t e r n a t e l y , t h i s a c k n o w l e g e m e n t m a y a p p e a r i n t h e s o f t w a r ei t s e l f ,
* i f a n d w h e r e v e r s u c h t h i r d- p a r t y a c k n o w l e g e m e n t s n o r m a l l y a p p e a r .
** 4 . T h e n a m e s " T h e J a k a r t a P r o j e c t " , " T o m c a t " , a n d " A p a c h e S o f tware
* F o u n d a t i o n " m u s t n o t b e u s e d t o e n d o r s e o r p r o m o t e p r o d u c t s
d e r i v e d* f r o m t h i s s o f t w a r e w i t h o u t p r i o r w r i t t e n p e r m i s s i o n . F o r w r i t t e n
* p e r m i s s i o n , p l e a s e c o n t a c t a p a c h e @ a p a c h e . o r g .
** 5 . P r o d u c t s d e r i v e d f r o m t h i s s o f t w a r e m a y n o t b e c a l l e d " A p a c h e "
* n o r m a y " A p a c h e " a p p e a r i n t h e i r n a m e s w i t h o u t p r i o r w r i t t e n
* p e r m i s s i o n o f t h e A p a c h e G r o u p .*
* T H I S S O F T W A R E I S P R O V I D E D ` ` A S I S ' ' A N D A N Y E X P R E S S E D O R I M P L I E D
* W A R R A N T I E S , I N C L U D I N G , B U T N O T L I M I T E D T O , T H E I M P L I E D W A R R A N T I E S* O F M E R C H A N T A B I L I T Y A N D F I T N E S S F O R A P A R T I C U L A R P U R P O S E A R E
* D I S C L A I M E D . I N N O E V E N T S H A L L T H E A P A C H E S O F T W A R E F O U N D A T I O N O R
* I T S C O N T R I B U T O R S B E L I A B L E F O R A N Y D I R E C T , I N D I R E C T , I N C I D E N T A L ,* S P E C I A L , E X E M P L A R Y , O R C O N S E Q U E N T I A L D A M A G E S ( I N C L U D I N G , B U T N O T
* L I M I T E D T O , P R O C U R E M E N T O F S U B S T I T U T E G O O D S O R S E R V I C E S ; L O S S O F
* U S E , D A T A , O R P R O F I T S ; O R B U S I N E S S I N T E R R U P T I O N ) H O W E V E R C A U S E D A N D* O N A N Y T H E O R Y O F L I A B I L I T Y , W H E T H E R I N C O N T R A C T , S T R I C T L I A B I LITY,
* O R T O R T ( I N C L U D I N G N E G L I G E N C E O R O T H E R W I S E ) A R I S I N G I N A N Y W A Y OUT
* O F T H E U S E O F T H I S S O F T W A R E , E V E N I F A D V I S E D O F T H E P O S S I B I L I TY OF* S U C H D A M A G E .
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
** T h i s s o f t w a r e c o n s i s t s o f v o l u n t a r y c o n t r i b u t i o n s m a d e b y m a n y
* i n d i v i d u a l s o n b e h a l f o f t h e A p a c h e S o f t w a r e F o u n d a t i o n . F o r more
* i n f o r m a t i o n o n t h e A p a c h e S o f t w a r e F o u n d a t i o n , p l e a s e s e e* < h t t p : / / w w w . a p a c h e . o r g / > .
*
* [ A d d i t i o n a l n o t i c e s , i f r e q u i r e d b y p r i o r l i c e n s i n g c o n d i t i o n s ]*
* /
p a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;i m p o r t j a v a . i o . * ;
i m p o r t j a v a . n e t . * ;
i m p o r t j a v a . u t i l . * ;i m p o r t j a v a x . s e r v l e t . * ;
i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * *
* C o r e i m p l e m e n t a t i o n o f a n a p p l i c a t i o n l e v e l s e s s i o n
** @ a u t h o r J a m e s D u n c a n D a v i d s o n [ d u n c a n @ e n g . s u n . c o m ]
* @ a u t h o r J a s o n H u n t e r [ j c h @ e n g . s u n . c o m ]
* @ a u t h o r J a m e s T o d d [ g o n z o @ e n g . s u n . c o m ]* /
p u b l i c c l a s s A p p l i c a t i o n S e s s i o n i m p l e m e n t s H t t p S e s s i o n {
p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;p r i v a t e H a s h t a b l e v a l u e s = n e w H a s h t a b l e ( ) ;
p r i v a t e S t r i n g i d ;
p r i v a t e S e r v e r S e s s i o n s e r v e r S e s s i o n ;p r i v a t e C o n t e x t c o n t e x t ;
p r i v a t e l o n g c r e a t i o n T i m e = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ; ;
p r i v a t e l o n g t h i s A c c e s s T i m e = c r e a t i o n T i m e ;p r i v a t e l o n g l a s t A c c e s s e d = c r e a t i o n T i m e ;
p r i v a t e i n t i n a c t i v e I n t e r v a l = - 1 ;
p r i v a t e b o o l e a n v a l i d = t r u e ;
A p p l i c a t i o n S e s s i o n ( S t r i n g i d , S e r v e r S e s s i o n s e r v e r S e s s i o n ,
C o n t e x t c o n t e x t ) {t h i s . s e r v e r S e s s i o n = s e r v e r S e s s i o n ;
t h i s . c o n t e x t = c o n t e x t ;
this.id = id;
t h i s . i n a c t i v e I n t e r v a l = c o n t e x t . g e t S e s s i o n T i m e O u t ( ) ;
i f ( t h i s . i n a c t i v e I n t e r v a l ! = -1 ) {
t h i s . i n a c t i v e I n t e r v a l * = 6 0 ;
}}
S e r v e r S e s s i o n g e t S e r v e r S e s s i o n ( ) {r e t u r n s e r v e r S e s s i o n ;
}
/ * *
* C a l l e d b y c o n t e x t w h e n r e q u e s t c o m e s i n s o t h a t a c c e s s e s a n d
* i n a c t i v i t i e s c a n b e d e a l t w i t h a c c o r d i n g l y .* /
v o i d a c c e s s e d ( ) {/ / s e t l a s t a c c e s s e d t o t h i s A c c e s s T i m e a s i t w i l l b e l e f t o v e r
/ / f r o m t h e p r e v i o u s a c c e s s
l a s t A c c e s s e d = t h i s A c c e s s T i m e ;t h i s A c c e s s T i m e = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ;
v a l i d a t e ( ) ;}
v o i d v a l i d a t e ( ) {/ / i f w e h a v e a n i n a c t i v e i n t e r v a l , c h e c k t o s e e i f w e ' v e e x c e e d e d i t
i f ( i n a c t i v e I n t e r v a l ! = - 1 ) {
i n t t h i s I n t e r v a l =( i n t ) ( S y s t e m . c u r r e n t T i m e M i l l i s ( ) - l a s t A c c e s s e d ) / 1 0 0 0 ;
i f ( t h i s I n t e r v a l > i n a c t i v e I n t e r v a l ) {i n v a l i d a t e ( ) ;
}
}}
/ / H T T P S E S S I O N I M P L E M E N T A T I O N M E T H O D S
p u b l i c S t r i n g g e t I d ( ) {
i f ( v a l i d ) {return id;
} e l s e {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;
}}
p u b l i c l o n g g e t C r e a t i o n T i m e ( ) {i f ( v a l i d ) {
r e t u r n c r e a t i o n T i m e ;
} e l s e {S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;}
}
/ * *
*
* @ d e p r e c a t e d* /
p u b l i c H t t p S e s s i o n C o n t e x t g e t S e s s i o n C o n t e x t ( ) {r e t u r n n e w S e s s i o n C o n t e x t I m p l ( ) ;
}
p u b l i c l o n g g e t L a s t A c c e s s e d T i m e ( ) {
i f ( v a l i d ) {
r e t u r n l a s t A c c e s s e d ;} e l s e {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;
}
}
p u b l i c v o i d i n v a l i d a t e ( ) {s e r v e r S e s s i o n . r e m o v e A p p l i c a t i o n S e s s i o n ( c o n t e x t ) ;
/ / r e m o v e e v e r y t h i n g i n t h e s e s s i o n
E n u m e r a t i o n e n u m = v a l u e s . k e y s ( ) ;
w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {S t r i n g n a m e = ( S t r i n g ) e n u m . n e x t E l e m e n t ( ) ;
r e m o v e V a l u e ( n a m e ) ;
}
v a l i d = f a l s e ;
}
p u b l i c b o o l e a n i s N e w ( ) {
i f ( ! v a l i d ) {S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;}
i f ( t h i s A c c e s s T i m e = = c r e a t i o n T i m e ) {r e t u r n t r u e ;
} e l s e {
r e t u r n f a l s e ;}
}
/ * *
* @ d e p r e c a t e d* /
p u b l i c v o i d p u t V a l u e ( S t r i n g n a m e , O b j e c t v a l u e ) {s e t A t t r i b u t e ( n a m e , v a l u e ) ;
}
p u b l i c v o i d s e t A t t r i b u t e ( S t r i n g n a m e , O b j e c t v a l u e ) {
i f ( ! v a l i d ) {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;
}
i f ( n a m e = = n u l l ) {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . v a l u e . i a e " ) ;
t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( m s g ) ;
}
r e m o v e V a l u e ( n a m e ) ; / / r e m o v e a n y e x i s t i n g b i n d i n g
i f ( v a l u e ! = n u l l & & v a l u e i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r ) {
H t t p S e s s i o n B i n d i n g E v e n t e =
n e w H t t p S e s s i o n B i n d i n g E v e n t ( t h i s , n a m e ) ;
( ( H t t p S e s s i o n B i n d i n g L i s t e n e r ) v a l u e ) . v a l u e B o u n d ( e ) ;
}
v a l u e s . p u t ( n a m e , v a l u e ) ;
}
/ * *
* @ d e p r e c a t e d* /
p u b l i c O b j e c t g e t V a l u e ( S t r i n g n a m e ) {
r e t u r n g e t A t t r i b u t e ( n a m e ) ;}
p u b l i c O b j e c t g e t A t t r i b u t e ( S t r i n g n a m e ) {i f ( ! v a l i d ) {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;
}
i f ( n a m e = = n u l l ) {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . v a l u e . i a e " ) ;
t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( m s g ) ;
}
r e t u r n v a l u e s . g e t ( n a m e ) ;
}
/ * *
* @ d e p r e c a t e d
* /p u b l i c S t r i n g [ ] g e t V a l u e N a m e s ( ) {
E n u m e r a t i o n e = g e t A t t r i b u t e N a m e s ( ) ;
V e c t o r n a m e s = n e w V e c t o r ( ) ;
w h i l e ( e . h a s M o r e E l e m e n t s ( ) ) {
n a m e s . a d d E l e m e n t ( e . n e x t E l e m e n t ( ) ) ;}
S t r i n g [ ] v a l u e N a m e s = n e w S t r i n g [ n a m e s . s i z e ( ) ] ;
n a m e s . c o p y I n t o ( v a l u e N a m e s ) ;
r e t u r n v a l u e N a m e s ;
}
p u b l i c E n u m e r a t i o n g e t A t t r i b u t e N a m e s ( ) {
i f ( ! v a l i d ) {S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;}
H a s h t a b l e v a l u e s C l o n e = ( H a s h t a b l e ) v a l u e s . c l o n e ( ) ;
r e t u r n ( E n u m e r a t i o n ) v a l u e s C l o n e . k e y s ( ) ;
}
/ * ** @ d e p r e c a t e d
* /
p u b l i c v o i d r e m o v e V a l u e ( S t r i n g n a m e ) {
r e m o v e A t t r i b u t e ( n a m e ) ;
}
p u b l i c v o i d r e m o v e A t t r i b u t e ( S t r i n g n a m e ) {
i f ( ! v a l i d ) {S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;}
i f ( n a m e = = n u l l ) {S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . v a l u e . i a e " ) ;
t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( m s g ) ;}
O b j e c t o = v a l u e s . g e t ( n a m e ) ;
i f ( o i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r ) {
H t t p S e s s i o n B i n d i n g E v e n t e =n e w H t t p S e s s i o n B i n d i n g E v e n t ( t h i s , n a m e ) ;
( ( H t t p S e s s i o n B i n d i n g L i s t e n e r ) o ) . v a l u e U n b o u n d ( e ) ;}
v a l u e s . r e m o v e ( n a m e ) ;}
p u b l i c v o i d s e t M a x I n a c t i v e I n t e r v a l ( i n t i n t e r v a l ) {i f ( ! v a l i d ) {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;
}
i n a c t i v e I n t e r v a l = i n t e r v a l ;
}
p u b l i c i n t g e t M a x I n a c t i v e I n t e r v a l ( ) {
i f ( ! v a l i d ) {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;
}
r e t u r n i n a c t i v e I n t e r v a l ;
}}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ApplicationSessionp a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t j a v a . i o . I O E x c e p t i o n ;i m p o r t j a v a . i o . O b j e c t I n p u t S t r e a m ;
i m p o r t j a v a . i o . O b j e c t O u t p u t S t r e a m ;
i m p o r t j a v a . i o . S e r i a l i z a b l e ;i m p o r t j a v a . u t i l . E n u m e r a t i o n ;
i m p o r t j a v a . u t i l . H a s h t a b l e ;
i m p o r t j a v a . u t i l . V e c t o r ;i m p o r t j a v a x . s e r v l e t . S e r v l e t E x c e p t i o n ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n B i n d i n g E v e n t ;i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n B i n d i n g L i s t e n e r ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n C o n t e x t ;
i m p o r t o r g . a p a c h e . t o m c a t . c a t a l i n a . * ;i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;
/ * *
* S t a n d a r d i m p l e m e n t a t i o n o f t h e < b > S e s s i o n < / b >
i n t e r f a c e . T h i s o b j e c t i s* serializable , s o t h a t i t c a n b e s t o r e d i n
p e r s i s t e n t s t o r a g e o r t r a n s f e r r e d
* t o a d i f f e r e n t J V M f o r d i s t r i b u t a b l e s e s s i o n s u p p o r t .
* < p >
* < b > I M P L E M E N T A T I O N N O T E < / b > : A n i n s t a n c e o f t h i s c l a s s r e p r e s e n t s b o t h t h e
* i n t e r n a l ( S e s s i o n ) a n d a p p l i c a t i o n l e v e l
( H t t p S e s s i o n ) v i e w o f t h e s e s s i o n .* H o w e v e r , b e c a u s e t h e c l a s s i t s e l f i s n o t d e c l a r e d
p u b l i c , J a v a l o g i c o u t s i d e
* o f t h e < c o d e > o r g . a p a c h e . t o m c a t . s e s s i o n < / c o d e > p a c k a g e c a n n o t c a s t a n
* H t t p S e s s i o n v i e w o f t h i s i n s t a n c e b a c k t o a
S e s s i o n v i e w .*
* @ a u t h o r C r a i g R . M c C l a n a h a n
* @ v e r s i o n $ R e v i s i o n : 1 . 2 $ $ D a t e : 2 0 0 0 / 0 5 / 1 5 1 7 : 5 4 : 1 0 $
* /
f i n a l c l a s s StandardSession
i m p l e m e n t s H t t p S e s s i o n, S e s s i o n {
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - C o n s t r u c t o r s
/ * ** C o n s t r u c t a n e w S e s s i o n a s s o c i a t e d w i t h t h e
s p e c i f i e d M a n a g e r .
** @p a r a m m a n a g e r T h e m a n a g e r w i t h w h i c h t h i s
S e s s i o n i s a s s o c i a t e d
* /p u b l i c S t a n d a r d S e s s i o n ( M a n a g e r manager) {
s u p e r ( ) ;t h i s . m a n a g e r = m a n a g e r ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - I n s t a n c e V a r i a b l e s
/ * *
* T h e c o l l e c t i o n o f u s e r d a t a a t t r i b u t e s
a s s o c i a t e d w i t h t h i s S e s s i o n .* /
p r i v a t e Hashtable a t t r i b u t e s = n e w H a s h t a b l e ();
/ * *
* T h e t i m e t h i s s e s s i o n w a s c r e a t e d , i n m i l l i s e c o n d s s i n c e m i d n i g h t ,
* January 1, 1970 GMT.
* /p r i v a t e l o n g c r e a t i o n T i m e = 0 L ;
/ * *
* T h e s e s s i o n i d e n t i f i e r o f t h i s S e s s i o n .
* /p r i v a t e S t r i n g i d = n u l l ;
/ * *
* D e s c r i p t i v e i n f o r m a t i o n d e s c r i b i n g t h i s
S e s s i o n i m p l e m e n t a t i o n .* /
p r i v a t e s t a t i c f i n a l S t r i n g i n f o =
" S t a n d a r d S e s s i o n / 1 . 0 " ;
/ * ** T h e l a s t a c c e s s e d t i m e f o r t h i s S e s s i o n .
* /
p r i v a t e l o n g l a s t A c c e s s e d T i m e = c r e a t i o n T i m e ;
/ * ** T h e M a n a g e r w i t h w h i c h t h i s S e s s i o n i s
a s s o c i a t e d .
* /p r i v a t e M a n a g e r m a n a g e r = n u l l ;
/ * *
* T h e m a x i m u m t i m e i n t e r v a l , i n s e c o n d s , b e t w e e n
c l i e n t r e q u e s t s b e f o r e* t h e s e r v l e t c o n t a i n e r m a y i n v a l i d a t e t h i s
s e s s i o n . A n e g a t i v e t i m e
* i n d i c a t e s t h a t t h e s e s s i o n s h o u l d n e v e r t i m e o u t .
* /
p r i v a t e i n t m a x I n a c t i v e I n t e r v a l = - 1 ;
/ * ** F l a g i n d i c a t i n g w h e t h e r t h i s s e s s i o n i s n e w o r
n o t .
* /p r i v a t e b o o l e a n i s N e w = t r u e ;
/ * *
* F l a g i n d i c a t i n g w h e t h e r t h i s s e s s i o n i s v a l i d
o r n o t .* /
p r i v a t e b o o l e a n isValid = f a l s e ;
/ * *
* T h e s t r i n g m a n a g e r f o r t h i s p a c k a g e .* /
p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " )
;
/ * *
* T h e H T T P s e s s i o n c o n t e x t a s s o c i a t e d w i t h t h i s s e s s i o n .
* /
p r i v a t e s t a t i c H t t p S e s s i o n C o n t e x t s e s s i o n C o n t e x t= n u l l ;
/ * *
* T h e c u r r e n t a c c e s s e d t i m e f o r t h i s s e s s i o n .
* /p r i v a t e l o n g thisAccessedTime = c r e a t i o n T i m e ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - S e s s i o n P r o p e r t i e s
/ * *
* S e t t h e c r e a t i o n t i m e f o r t h i s s e s s i o n . T h i s
m e t h o d i s c a l l e d b y t h e* M a n a g e r w h e n a n e x i s t i n g S e s s i o n i n s t a n c e i s
r e u s e d .
** @p a r a m t i m e T h e n e w c r e a t i o n t i m e
* /
p u b l i c v o i d s e t C r e a t i o n T i m e ( l o n g t i m e ) {
t h i s . c r e a t i o n T i m e = time;
t h i s . l a s t A c c e s s e d T i m e = t i m e ;t h i s . t h i s A c c e s s e d T i m e = t i m e ;
}
/ * ** R e t u r n t h e s e s s i o n i d e n t i f i e r f o r t h i s
s e s s i o n .
* /p u b l i c S t r i n g g e t I d ( ) {
r e t u r n ( t h i s . i d ) ;
}
/ * *
* S e t t h e s e s s i o n i d e n t i f i e r f o r t h i s s e s s i o n .*
* @ p a r a m i d T h e n e w s e s s i o n i d e n t i f i e r
* /p u b l i c v o i d s e t I d ( S t r i n g i d ) {
i f ( ( t h i s . i d ! = n u l l ) & & ( m a n a g e r ! = n u l l ) & &( m a n a g e r i n s t a n c e o f M a n a g e r B a s e ) )
( ( M a n a g e r B a s e ) m a n a g e r ) . r e m o v e ( t h i s ) ;
this.id = id;
i f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e r i n s t a n c e o f M a n a g e r B a s e ) )
( (M a n a g e r B a s e ) m a n a g e r ) . a d d ( t h i s ) ;
}
/ * *
* R e t u r n d e s c r i p t i v e i n f o r m a t i o n a b o u t t h i s
S e s s i o n i m p l e m e n t a t i o n a n d* t h e c o r r e s p o n d i n g v e r s i o n n u m b e r , i n t h e
f o r m a t
* < c o d e > & l t ; d e s c r i p t i o n & g t ; / & l t ; v e r s i o n & g t ; < / c o d e > .
* /
p u b l i c S t r i n g g e t I n f o () {
return (this.info);
}
/ * *
* R e t u r n t h e l a s t t i m e t h e c l i e n t s e n t a r e q u e s t
a s s o c i a t e d w i t h t h i s* s e s s i o n , a s t h e n u m b e r o f m i l l i s e c o n d s s i n c e
m i d n i g h t , J a n u a r y 1 , 1 9 7 0
* G M T . A c t i o n s t h a t y o u r a p p l i c a t i o n t a k e s , s u c h a s g e t t i n g o r s e t t i n g
* a v a l u e a s s o c i a t e d w i t h t h e s e s s i o n , d o n o t
a f f e c t t h e a c c e s s t i m e .* /
p u b l i c l o n g g e t L a s t A c c e s s e d T i m e ( ) {
r e t u r n ( t h i s . l a s t A c c e s s e d T i m e ) ;
}
/ * ** R e t u r n t h e M a n a g e r w i t h i n w h i c h t h i s S e s s i o n
is valid.
* /p u b l i c M a n a g e r g e t M a n a g e r ( ) {
r e t u r n ( t h i s . m a n a g e r ) ;
}
/ * *
* S e t t h e M a n a g e r w i t h i n w h i c h t h i s S e s s i o n i s v a l i d .
*
* @p a r a m m a n a g e r T h e n e w M a n a g e r* /
p u b l i c v o i d s e t M a n a g e r ( M a n a g e r manager) {
t h i s . m a n a g e r = m a n a g e r ;
}
/ * ** R e t u r n t h e m a x i m u m t i m e i n t e r v a l , i n s e c o n d s ,
b e t w e e n c l i e n t r e q u e s t s
* b e f o r e t h e s e r v l e t c o n t a i n e r w i l l i n v a l i d a t e t h e s e s s i o n . A n e g a t i v e
* t i m e i n d i c a t e s t h a t t h e s e s s i o n s h o u l d n e v e r
time out.*
* @ e x c e p t i o n IllegalStateException i f t h i s
m e t h o d i s c a l l e d o n* a n i n v a l i d a t e d s e s s i o n
* /
p u b l i c i n t g e t M a x I n a c t i v e I n t e r v a l () {
r e t u r n ( t h i s . m a x I n a c t i v e I n t e r v a l ) ;
}
/ * *
* S e t t h e m a x i m u m t i m e i n t e r v a l , i n s e c o n d s ,
b e t w e e n c l i e n t r e q u e s t s* b e f o r e t h e s e r v l e t c o n t a i n e r w i l l i n v a l i d a t e
t h e s e s s i o n . A n e g a t i v e
* t i m e i n d i c a t e s t h a t t h e s e s s i o n s h o u l d n e v e r time out.
*
* @p a r a m i n t e r v a l T h e n e w m a x i m u m i n t e r v a l* /
p u b l i c v o i d s e t M a x I n a c t i v e I n t e r v a l ( i n t interval)
{
t h i s . m a x I n a c t i v e I n t e r v a l = i n t e r v a l ;
}
/ * *
* R e t u r n t h e < c o d e > H t t p S e s s i o n < / c o d e > f o r w h i c h t h i s
o b j e c t* is the facade.
* /
p u b l i c H t t p S e s s i o n g e t S e s s i o n ( ) {
r e t u r n ( ( H t t p S e s s i o n ) t h i s ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
S e s s i o n P u b l i c M e t h o d s
/ * *
* U p d a t e t h e a c c e s s e d t i m e i n f o r m a t i o n f o r t h i s s e s s i o n . T h i s m e t h o d
* s h o u l d b e c a l l e d b y t h e c o n t e x t w h e n a r e q u e s t c o m e s i n
f o r a p a r t i c u l a r* s e s s i o n , e v e n i f t h e a p p l i c a t i o n d o e s n o t r e f e r e n c e i t .
* /
p u b l i c v o i d a c c e s s ( ) {
t h i s . l a s t A c c e s s e d T i m e = t h i s . t h i s A c c e s s e d T i m e ;
t h i s . t h i s A c c e s s e d T i m e = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ;t h i s . i s N e w = f a l s e ;
}
/ * *
* P e r f o r m t h e i n t e r n a l p r o c e s s i n g r e q u i r e d t o i n v a l i d a t e t h i s s e s s i o n ,
* w i t h o u t t r i g g e r i n g a n e x c e p t i o n i f t h e s e s s i o n h a s
a l r e a d y e x p i r e d .* /
p u b l i c v o i d e x p i r e ( ) {
/ / R e m o v e t h i s s e s s i o n f r o m o u r m a n a g e r ' s a c t i v e
s e s s i o n s
i f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e r i n s t a n c e o fM a n a g e r B a s e ) )
( (M a n a g e r B a s e ) m a n a g e r ) . r e m o v e ( t h i s ) ;
/ / U n b i n d a n y o b j e c t s a s s o c i a t e d w i t h t h i s s e s s i o n
V e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = getAttributeNames ( ) ;w h i l e ( a t t r s . h a s M o r e E l e m e n t s ()) {
S t r i n g attr = ( S t r i n g ) a t t r s . n e x t E l e m e n t ( ) ;
r e s u l t s . a d d E l e m e n t ( a t t r ) ;}
E n u m e r a t i o n n a m e s = r e s u l t s . e l e m e n t s ( ) ;
w h i l e ( n a m e s . h a s M o r e E l e m e n t s ()) {S t r i n g n a m e = ( S t r i n g ) n a m e s . n e x t E l e m e n t ( ) ;
r e m o v e A t t r i b u t e ( n a m e) ;
}
/ / M a r k t h i s s e s s i o n a s i n v a l i d
s e t V a l i d ( f a l s e ) ;
}
/ * *
* R e l e a s e a l l o b j e c t r e f e r e n c e s , a n d i n i t i a l i z e i n s t a n c e v a r i a b l e s , i n
* p r e p a r a t i o n f o r r e u s e o f t h i s o b j e c t .
* /p u b l i c v o i d r e c y c l e ( ) {
/ / R e s e t t h e i n s t a n c e v a r i a b l e s a s s o c i a t e d w i t h t h i s S e s s i o n
a t t r i b u t e s . c l e a r ( ) ;
c r e a t i o n T i m e = 0 L ;i d = n u l l ;
l a s t A c c e s s e d T i m e = 0 L ;
m a n a g e r = n u l l ;m a x I n a c t i v e I n t e r v a l = - 1;
i s N e w = t r u e ;
i s V a l i d = f a l s e ;
/ / T e l l o u r M a n a g e r t h a t t h i s S e s s i o n h a s b e e n r e c y c l e d
i f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e r i n s t a n c e o f M a n a g e r B a s e ) )
( ( M a n a g e r B a s e ) m a n a g e r ) . r e c y c l e ( t h i s ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - S e s s i o n
P a c k a g e M e t h o d s
/ * *
* R e t u r n t h e < c o d e > i s V a l i d < / c o d e > f l a g f o r t h i s s e s s i o n .* /
b o o l e a n i s V a l i d ( ) {
r e t u r n ( t h i s . i s V a l i d ) ;
}
/ * ** S e t t h e < c o d e > i s N e w < / c o d e > f l a g f o r t h i s s e s s i o n .
*
* @p a r a m i s N e w T h e n e w v a l u e f o r t h e < c o d e > i s N e w < / c o d e > f l a g
* /
void s e t N e w ( b o o l e a n i s N e w ) {
t h i s . i s N e w = i s N e w;
}
/ * *
* Set the <code> i s V a l i d < / c o d e > f l a g f o r t h i s s e s s i o n .
** @p a r a m isValid T h e n e w v a l u e f o r t h e
< c o d e > i s V a l i d < / c o d e > f l a g
* /void s e t V a l i d ( b o o l e a n isValid ) {
t h i s . i s V a l i d = i s V a l i d ;}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
H t t p S e s s i o n P r o p e r t i e s
/ * *
* R e t u r n t h e t i m e w h e n t h i s s e s s i o n w a s c r e a t e d , i n m i l l i s e c o n d s s i n c e
* m i d n i g h t , J a n u a r y 1 , 1 9 7 0 G M T .
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s
c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n* /
p u b l i c l o n g g e t C r e a t i o n T i m e ( ) {
r e t u r n ( t h i s . c r e a t i o n T i m e ) ;
}
/ * ** R e t u r n t h e s e s s i o n c o n t e x t w i t h w h i c h t h i s s e s s i o n i s
a s s o c i a t e d .
** @ d e p r e c a t e d A s o f V e r s i o n 2 . 1 , t h i s m e t h o d i s d e p r e c a t e d
a n d h a s n o
* r e p l a c e m e n t . I t w i l l b e r e m o v e d i n a f u t u r e v e r s i o n o f t h e
* J a v a S e r v l e t A P I .
* /p u b l i c H t t p S e s s i o n C o n t e x t g e t S e s s i o n C o n t e x t () {
i f ( s e s s i o n C o n t e x t = = n u l l )s e s s i o n C o n t e x t = new S t a n d a r d S e s s i o n C o n t e x t ();
r e t u r n ( s e s s i o n C o n t e x t ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
H t t p S e s s i o n P u b l i c M e t h o d s
/ * *
* R e t u r n t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e i n t h i s s e s s i o n , o r
* < c o d e > n u l l < / c o d e > i f n o o b j e c t i s b o u n d w i t h t h a t n a m e .
** @p a r a m n a m e N a m e o f t h e a t t r i b u t e t o b e r e t u r n e d
*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
* /p u b l i c O b j e c t g e t A t t r i b u t e ( S t r i n g n a m e ) {
r e t u r n ( a t t r i b u t e s . g e t ( n a m e ) ) ;
}
/ * *
* R e t u r n a n < c o d e > E n u m e r a t i o n < / c o d e > o f < c o d e > S t r i n g < / c o d e > o b j e c t s
* c o n t a i n i n g t h e n a m e s o f t h e o b j e c t s b o u n d t o t h i s
s e s s i o n .*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s
c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
* /
p u b l i c E n u m e r a t i o n g e t A t t r i b u t e N a m e s ( ) {
r e t u r n ( a t t r i b u t e s . k e y s ( ) ) ;
}
/ * *
* R e t u r n t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e i n t h i s
s e s s i o n , o r* < c o d e > n u l l < / c o d e > i f n o o b j e c t i s b o u n d w i t h t h a t n a m e .
*
* @ p a r a m n a m e N a m e o f t h e v a l u e t o b e r e t u r n e d*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s
c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d i s r e p l a c e d b y
* < c o d e > g e t A t t r i b u t e ( ) < / c o d e >
* /p u b l i c O b j e c t g e t V a l u e ( S t r i n g n a m e ) {
r e t u r n ( getAttribute(name ) ) ;
}
/ * *
* R e t u r n t h e s e t o f n a m e s o f o b j e c t s b o u n d t o t h i s s e s s i o n . I f t h e r e
* a r e n o s u c h o b j e c t s , a z e r o - l e n g t h a r r a y i s r e t u r n e d .
** @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s
c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d i s r e p l a c e d
b y* < c o d e >g e t A t t r i b u t e N a m e s ()</code>
* /
p u b l i c S t r i n g [ ] getValueNames ( ) {
V e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = getAttributeNames ( ) ;w h i l e ( a t t r s . h a s M o r e E l e m e n t s ()) {
S t r i n g attr = ( S t r i n g ) a t t r s . n e x t E l e m e n t ( ) ;
r e s u l t s . a d d E l e m e n t ( a t t r ) ;}
S t r i n g n a m e s [ ] = n e w S t r i n g [ r e s u l t s . s i z e ( ) ] ;
f o r ( int i = 0 ; i < n a m e s . l e n g t h ; i + + )n a m e s [ i ] = ( S t r i n g ) r e s u l t s . e l e m e n t A t ( i ) ;
r e t u r n ( n a m e s ) ;
}
/ * *
* I n v a l i d a t e s t h i s s e s s i o n a n d u n b i n d s a n y o b j e c t s b o u n d
t o i t .*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s
called on* a n i n v a l i d a t e d s e s s i o n
* /
p u b l i c v o i d i n v a l i d a t e ( ) {
// Cause this session to expire
e x p i r e ( ) ;
}
/ * *
* R e t u r n < c o d e > t r u e < / c o d e > i f t h e c l i e n t d o e s n o t y e t k n o w about the
* s e s s i o n , o r i f t h e c l i e n t c h o o s e s n o t t o j o i n t h e
s e s s i o n . F o r* e x a m p l e , i f t h e s e r v e r u s e d o n l y c o o k i e - b a s e d s e s s i o n s ,
a n d t h e c l i e n t
* h a s d i s a b l e d t h e u s e o f c o o k i e s , t h e n a s e s s i o n w o u l d b e n e w o n e a c h
* request.
** @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s
c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n* /
p u b l i c b o o l e a n i s N e w () {
r e t u r n ( t h i s . i s N e w) ;
}
/ * ** B i n d a n o b j e c t t o t h i s s e s s i o n , u s i n g t h e s p e c i f i e d n a m e . I f a n o b j e c t
* o f t h e s a m e n a m e i s a l r e a d y b o u n d t o t h i s s e s s i o n , t h e o b j e c t i s
* r e p l a c e d .* <p>
* After this method executes, and if the object implements
* < c o d e > H t t p S e s s i o n B i n d i n g L i s t e n e r < / c o d e > , t h e c o n t a i n e r c a l l s* < c o d e > v a l u e B o u n d ( ) < / c o d e > o n t h e o b j e c t .
*
* @ p a r a m n a m e N a m e t o w h i c h t h e o b j e c t i s b o u n d , c a n n o t b e n u l l* @ p a r a m v a l u e O b j e c t t o b e b o u n d , c a n n o t b e n u l l
*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d i s r e p l a c e d b y* < c o d e >s e t A t t r i b u t e( ) < / c o d e >
* /
p u b l i c v o i d p u t V a l u e ( S t r i n g n a m e , O b j e c t v a l u e ) {
s e t A t t r i b u t e ( n a m e , value);
}
/ * *
* R e m o v e t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e f r o m t h i s s e s s i o n . I f
* t h e s e s s i o n d o e s n o t h a v e a n o b j e c t b o u n d w i t h t h i s n a m e , t h i s m e t h o d* d o e s n o t h i n g .
* <p>
* After this method executes, and if the object implements* < c o d e > HttpSessionBindingListener < / c o d e > , t h e c o n t a i n e r c a l l s
* < c o d e > v a l u e U n b o u n d ( ) < / c o d e > o n t h e o b j e c t .
** @p a r a m n a m e N a m e o f t h e o b j e c t t o r e m o v e f r o m t h i s s e s s i o n .
*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
* /
p u b l i c v o i d r e m o v e A t t r i b u t e ( S t r i n g n a m e ) {
s y n c h r o n i z e d ( a t t r i b u t e s ) {
O b j e c t o b j e c t = a t t r i b u t e s . g e t ( n a m e ) ;i f ( o b j e c t = = n u l l )
r e t u r n ;
a t t r i b u t e s . r e m o v e ( n a m e ) ;// S y s t e m . o u t . p r i n t l n( " R e m o v i n g a t t r i b u t e " + n a m e ) ;
if (object instanceof H t t p S e s s i o n B i n d i n g L i s t e n e r ) {
( ( H t t p S e s s i o n B i n d i n g L i s t e n e r) o b j e c t ) . v a l u e U n b o u n d( n e w H t t p S e s s i o n B i n d i n g E v e n t ( ( H t t p S e s s i o n ) this, name));
}
}
}
/ * *
* R e m o v e t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e f r o m t h i s s e s s i o n . I f* t h e s e s s i o n d o e s n o t h a v e a n o b j e c t b o u n d w i t h t h i s n a m e , t h i s m e t h o d
* d o e s n o t h i n g .
* <p>* After this method executes, and if the object implements
* < c o d e > HttpSessionBindingListener < / c o d e > , t h e c o n t a i n e r c a l l s
* < c o d e > v a l u e U n b o u n d ( ) < / c o d e > o n t h e o b j e c t .*
* @p a r a m n a m e N a m e o f t h e o b j e c t t o r e m o v e f r o m t h i s s e s s i o n .
** @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
** @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d i s r e p l a c e d b y
* < c o d e >r e m o v e A t t r i b u t e ( ) < / c o d e >
* /p u b l i c v o i d r e m o v e V a l u e ( S t r i n g n a m e ) {
r e m o v e A t t r i b u t e ( n a m e ) ;
}
/ * *
* B i n d a n o b j e c t t o t h i s s e s s i o n , u s i n g t h e s p e c i f i e d n a m e . I f a n o b j e c t* o f t h e s a m e n a m e i s a l r e a d y b o u n d t o t h i s s e s s i o n , t h e o b j e c t i s
* r e p l a c e d .
* <p>* After this method executes, and if the object implements
* < c o d e > H t t p S e s s i o n B i n d i n g L i s t e n e r < / c o d e > , t h e c o n t a i n e r c a l l s
* < c o d e > v a l u e B o u n d ( ) < / c o d e > o n t h e o b j e c t .*
* @ p a r a m n a m e N a m e t o w h i c h t h e o b j e c t i s b o u n d , c a n n o t b e n u l l
* @ p a r a m v a l u e O b j e c t t o b e b o u n d , c a n n o t b e n u l l*
* @ e x c e p t i o n I l l e g a l A r g u m e n t E x c e p t i o n i f a n a t t e m p t i s m a d e t o a d d a
* n o n - s e r i a l i z a b l e o b j e c t i n a n e n v i r o n m e n t m a r k e d d i s t r i b u t a b l e .* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
* /p u b l i c v o i d s e t A t t r i b u t e ( S t r i n g name, Object value) {
i f ( ( m a n a g e r ! = n u l l ) & & m a n a g e r . g e t D i s t r i b u t a b l e ( ) & &! ( v a l u e i n s t a n c e o f S e r i a l i z a b l e ) )
throw new I l l e g a l A r g u m e n t E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d S e s s i o n . s e t A t t r i b u t e . i a e " ) ) ;
s y n c h r o n i z e d ( a t t r i b u t e s ) {
r e m o v e A t t r i b u t e ( n a m e) ;a t t r i b u t e s . p u t ( n a m e , v a l u e ) ;
if (value i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r )
( ( H t t p S e s s i o n B i n d i n g L i s t e n e r) value).valueBound( n e w H t t p S e s s i o n B i n d i n g E v e n t ( ( H t t p S e s s i o n ) this, name));
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HttpSession P r i v a t e M e t h o d s
/ * *
* R e a d a s e r i a l i z e d v e r s i o n o f t h i s s e s s i o n o b j e c t f r o m t h e s p e c i f i e d
* o b j e c t i n p u t s t r e a m .* <p>
* < b > I M P L E M E N T A T I O N N O T E < / b > : T h e r e f e r e n c e t o t h e o w n i n g M a n a g e r
* i s n o t r e s t o r e d b y t h i s m e t h o d , a n d m u s t b e s e t e x p l i c i t l y .*
* @p a r a m s t r e a m T h e i n p u t s t r e a m t o r e a d f r o m
** @ e x c e p t i o n C l a s s N o t F o u n d E x c e p t i o n i f a n u n k n o w n c l a s s i s s p e c i f i e d
* @ e x c e p t i o n I O E x c e p t i o n i f a n i n p u t / o u t p u t e r r o r o c c u r s
* /p r i v a t e v o i d r e a d O b j e c t ( O b j e c t I n p u t S t r e a m s t r e a m )
t h r o w s C l a s s N o t F o u n d E x c e p t i o n , I O E x c e p t i o n {
/ / D e s e r i a l i z e t h e s c a l a r i n s t a n c e v a r i a b l e s ( e x c e p t M a n ager)
c r e a t i o n T i m e = ( ( L o n g ) s t r e a m . r e a d O b j e c t ( ) ) . l o n g V a l u e ( ) ;
i d = ( S t r i n g ) s t r e a m . r e a d O b j e c t ( ) ;l a s t A c c e s s e d T i m e = ( ( L o n g ) s t r e a m . r e a d O b j e c t ( ) ) . l o n g V a l u e ( ) ;
m a x I n a c t i v e I n t e r v a l = ( ( I n t e g e r ) s t r e a m . r e a d O b j e c t ( ) ) . i n t V a l u e ( ) ;
i s N e w = ( ( B o o l e a n ) s t r e a m . r e a d O b j e c t ( ) ) . b o o l e a n V a l u e ( ) ;i s V a l i d = ( ( B o o l e a n ) s t r e a m . r e a d O b j e c t ( ) ) . b o o l e a n V a l u e ( ) ;
/ / D e s e r i a l i z e t h e a t t r i b u t e c o u n t a n d a t t r i b u t e v a l u e si n t n = ( ( I n t e g e r ) s t r e a m . r e a d O b j e c t ( ) ) . i n t V a l u e ( ) ;
f o r ( i n t i = 0 ; i < n ; i + + ) {
S t r i n g n a m e = ( S t r i n g ) s t r e a m . r e a d O b j e c t ( ) ;O b j e c t v a l u e = ( O b j e c t ) s t r e a m . r e a d O b j e c t ( ) ;
a t t r i b u t e s . p u t ( n a m e , v a l u e ) ;
}
}
/ * *
* W r i t e a s e r i a l i z e d v e r s i o n o f t h i s s e s s i o n o b j e c t t o t h e s p e c i f i e d* o b j e c t o u t p u t s t r e a m .
* <p>
* < b > I M P L E M E N T A T I O N N O T E < / b > : T h e o w n i n g M a n a g e r w i l l n o t b e s t o r e d* i n t h e s e r i a l i z e d r e p r e s e n t a t i o n o f t h i s S e s s i o n . A f t e r c a l l i n g
* < c o d e > r e a d O b j e c t ( ) < / c o d e > , y o u m u s t s e t t h e a s s o c i a t e d M a n a g e r
* e x p l i c i t l y .* <p>
* < b > I M P L E M E N T A T I O N N O T E < / b > : A n y a t t r i b u t e t h a t i s n o t S e r i a l i z a b l e
* w i l l b e s i l e n t l y i g n o r e d . I f y o u d o n o t w a n t a n y s u c h a t t r i b u t e s ,* b e s u r e t h e < c o d e > d i s t r i b u t a b l e < / c o d e > p r o p e r t y o f o u r a s s o c i a t e d
* M a n a g e r i s s e t t o < c o d e > t r u e < / c o d e > .
** @p a r a m s t r e a m T h e o u t p u t s t r e a m t o w r i t e t o
*
* @ e x c e p t i o n I O E x c e p t i o n i f a n i n p u t / o u t p u t e r r o r o c c u r s* /
p r i v a t e v o i d w r i t e O b j e c t ( O b j e c t O u t p u t S t r e a m s t r e a m ) t h r o w s I O E x c e p t i o n {
/ / W r i t e t h e s c a l a r i n s t a n c e v a r i a b l e s ( e x c e p t M a n a g e r )
s t r e a m . w r i t e O b j e c t ( n e w L o n g ( c r e a t i o n T i m e ));
s t r e a m . w r i t e O b j e c t ( i d ) ;s t r e a m . w r i t e O b j e c t ( n e w L o n g ( l a s t A c c e s s e d T i m e ) ) ;
s t r e a m . w r i t e O b j e c t ( n e w I n t e g e r ( m a x I n a c t i v e I n t e r v a l ) ) ;
s t r e a m . w r i t e O b j e c t ( n e w B o o l e a n ( i s N e w ) ) ;s t r e a m . w r i t e O b j e c t ( n e w B o o l e a n ( i s V a l i d ) ) ;
/ / A c c u m u l a t e t h e n a m e s o f s e r i a l i z a b l e a t t r i b u t e sV e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = g e t A t t r i b u t e N a m e s ( ) ;
w h i l e ( a t t r s . h a s M o r e E l e m e n t s ( ) ) {S t r i n g a t t r = ( S t r i n g ) a t t r s . n e x t E l e m e n t ( ) ;
O b j e c t v a l u e = a t t r i b u t e s . g e t ( a t t r ) ;
i f ( v a l u e i n s t a n c e o f S e r i a l i z a b l e )r e s u l t s . a d d E l e m e n t ( a t t r ) ;
}
/ / S e r i a l i z e t h e a t t r i b u t e c o u n t a n d t h e a t t r i b u t e v a l u e s
s t r e a m . w r i t e O b j e c t ( n e w I n t e g e r ( r e s u l t s . s i z e ( ) ) ) ;
E n u m e r a t i o n n a m e s = r e s u l t s . e l e m e n t s ( ) ;w h i l e ( n a m e s . h a s M o r e E l e m e n t s ()) {
S t r i n g n a m e = ( S t r i n g ) n a m e s . n e x t E l e m e n t ( ) ;
s t r e a m . w r i t e O b j e c t ( n a m e ) ;s t r e a m . w r i t e O b j e c t ( a t t r i b u t e s . g e t ( n a m e) ) ;
}
}
c r o s s c u t invalidate(StandardSession s ) : s & ( int getMaxInactiveInterval ( ) |
long getCreationTime ( ) |
O b j e c t g e t A t t r i b u t e ( S t r i n g ) | E n u m e r a t i o n g e t A t t r i b u t e N a m e s () |
String[] g e t V a l u e N a m e s () |
v o i d i n v a l i d a t e ( ) |boolean i s N e w( ) |
void r e m o v e A t t r i b u t e ( S t r i n g ) |
void s e t A t t r i b u t e ( S t r i n g , O b j e c t ) ) ;
s t a t i c advice(StandardSession s ) : i n v a l i d a t e ( s ) {
b e f o r e {if (!s . i s V a l i d( ) )
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n
( s . s m . g e t S t r i n g ( " s t a n d a r d S e s s i o n . " + t h i s J o i n P o i n t . m e t h o d N a m e
+ " . i s e "));
}}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P r i v a t e C l a s s
/ * ** T h i s c l a s s i s a d u m m y i m p l e m e n t a t i o n o f t h e < c o d e > H t t p S e s s i o n C o n t e x t < / c o d e >
* i n t e r f a c e , t o c o n f o r m t o t h e r e q u i r e m e n t t h a t s u c h a n o b j e c t be returned
* w h e n < c o d e >H t t p S e s s i o n . g e t S e s s i o n C o n t e x t ()</code> is called.*
* @ a u t h o r C r a i g R . M c C l a n a h a n
** @ d e p r e c a t e d A s o f J a v a S e r v l e t A P I 2 . 1 w i t h n o r e p l a c e m e n t . T h e
* i n t e r f a c e w i l l b e r e m o v e d i n a f u t u r e v e r s i o n o f t h i s A P I .
* /
f i n a l c l a s s S t a n d a r d S e s s i o n C o n t e x t i m p l e m e n t s H t t p S e s s i o n C o n t e x t {
p r i v a t e V e c t o r d u m m y = n e w V e c t o r ( ) ;
/ * *
* R e t u r n t h e s e s s i o n i d e n t i f i e r s o f a l l s e s s i o n s d e f i n e d
* w i t h i n t h i s c o n t e x t .*
* @ d e p r e c a t e d A s o f J a v a S e r v l e t A P I 2 . 1 w i t h n o r e p l a c e m e n t .
* T h i s m e t h o d m u s t r e t u r n a n e m p t y < c o d e > E n u m e r a t i o n < / c o d e >* a n d w i l l b e r e m o v e d i n a f u t u r e v e r s i o n o f t h e A P I .
* /
p u b l i c E n u m e r a t i o n g e t I d s () {
r e t u r n ( d u m m y . e l e m e n t s ( ) ) ;
}
/ * *
* R e t u r n t h e < c o d e > H t t p S e s s i o n < / c o d e > a s s o c i a t e d w i t h t h e
* s p e c i f i e d s e s s i o n i d e n t i f i e r .*
* @p a r a m i d S e s s i o n i d e n t i f i e r f o r w h i c h t o l o o k u p a s e s s i o n
** @ d e p r e c a t e d A s o f J a v a S e r v l e t A P I 2 . 1 w i t h n o r e p l a c e m e n t .
* T h i s m e t h o d m u s t r e t u r n n u l l a n d w i l l b e r e m o v e d i n a
* f u t u r e v e r s i o n o f t h e A P I .* /
p u b l i c H t t p S e s s i o n g e t S e s s i o n ( S t r i n g id) {
r e t u r n ( n u l l ) ;
}
}
StandardSession
p a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t j a v a . i o . I O E x c e p t i o n ;
i m p o r t j a v a . u t i l . E n u m e r a t i o n ;i m p o r t j a v a . u t i l . H a s h t a b l e ;
i m p o r t j a v a . u t i l . V e c t o r ;
i m p o r t o r g . a p a c h e . t o m c a t . c a t a l i n a . * ;i m p o r t j a v a x . s e r v l e t . h t t p . C o o k i e ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;i m p o r t o r g . w 3 c . d o m . N a m e d N o d e M a p ;
i m p o r t o r g . w 3 c . d o m . N o d e ;
/ * *
* S t a n d a r d i m p l e m e n t a t i o n o f t h e < b > M a n a g e r < / b > i n t e r f a c e t h a t p r o v i d e s* n o s e s s i o n p e r s i s t e n c e o r d i s t r i b u t a b l e c a p a b i l i t i e s , b u t d o e s s u p p o r t
* a n o p t i o n a l , c o n f i g u r a b l e , m a x i m u m n u m b e r o f a c t i v e s e s s i o n s a l l o w e d .
* < p >* L i f e c y c l e c o n f i g u r a t i o n o f t h i s c o m p o n e n t a s s u m e s a n X M L n o d e
* i n t h e f o l l o w i n g f o r m a t :
* <code>* &l t ; M a n a g e r className= " o r g . a p a c h e . t o m c a t . s e s s i o n . S t a n d a r d M a n a g e r "
* c h e c k I n t e r v a l = " 6 0 " m a x A c t i v e S e s s i o n s = " - 1"
* m a x I n a c t i v e I n t e r v a l = " -1 " / >* < / c o d e >
* w h e r e y o u c a n a d j u s t t h e f o l l o w i n g p a r a m e t e r s , w i t h d e f a u l t v alues
* i n s q u a r e b r a c k e t s :* < u l >
* < l i > < b > c h e c k I n t e r v a l < / b > - T h e i n t e r v a l ( i n s e c o n d s ) b e t w e e n b a c k g r o u n d
* t h r e a d c h e c k s f o r e x p i r e d s e s s i o n s . [ 6 0 ]* < l i > < b > m a x A c t i v e S e s s i o n s < / b > - T h e m a x i m u m n u m b e r o f s e s s i o n s a l l o w e d t o
* b e a c t i v e a t o n c e , o r - 1 f o r n o l i m i t . [ - 1]
* < l i > < b > m a x I n a c t i v e I n t e r v a l < / b > - T h e d e f a u l t m a x i m u m n u m b e r o f s e c o n d s o f* i n a c t i v i t y b e f o r e w h i c h t h e s e r v l e t c o n t a i n e r i s a l l o w e d to time out
* a session, or - 1 f o r n o l i m i t . T h i s v a l u e s h o u l d b e o v e r r i d d e n f r o m
* t h e d e f a u l t s e s s i o n t i m e o u t s p e c i f i e d i n t h e w e b a p p l i c a t i o n d e p l o y m e n t* d e s c r i p t o r , i f a n y . [ - 1 ]
* < / u l >
** @ a u t h o r C r a i g R . M c C l a n a h a n
* @ v e r s i o n $ R e v i s i o n : 1 . 1 . 1 . 1 $ $ D a t e : 2 0 0 0 / 0 5 / 0 2 2 1 : 2 8 : 3 0 $
* /
p u b l i c f i n a l c l a s s S t a n d a r d M a n a g e r
e x t e n d s M a n a g e r B a s ei m p l e m e n t s L i f e c y c l e , R u n n a b l e {
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - I n s t a n c e V a r i a b l e s
/ * *
* T h e i n t e r v a l ( i n s e c o n d s ) b e t w e e n c h e c k s f o r e x p i r e d s e s s ions.
* /p r i v a t e i n t c h e c k I n t e r v a l = 6 0 ;
/ * *
* H a s t h i s c o m p o n e n t b e e n c o n f i g u r e d y e t ?
* /p r i v a t e b o o l e a n c o n f i g u r e d = f a l s e ;
/ * *
* T h e d e s c r i p t i v e i n f o r m a t i o n a b o u t t h i s i m p l e m e n t a t i o n .
* /p r i v a t e s t a t i c f i n a l S t r i n g i n f o = " S t a n d a r d M a n a g e r / 1 . 0 " ;
/ * *
* T h e m a x i m u m n u m b e r o f a c t i v e S e s s i o n s a l l o w e d , o r - 1 f o r n o l i m i t .
* /p r o t e c t e d i n t m a x A c t i v e S e s s i o n s = - 1 ;
/ * *
* T h e s t r i n g m a n a g e r f o r t h i s p a c k a g e .
* /p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;
/ * *
* H a s t h i s c o m p o n e n t b e e n s t a r t e d y e t ?* /
p r i v a t e b o o l e a n s t a r t e d = f a l s e ;
/ * *
* T h e b a c k g r o u n d t h r e a d .* /
p r i v a t e T h r e a d t h r e a d = n u l l ;
/ * *
* T h e b a c k g r o u n d t h r e a d c o m p l e t i o n s e m a p h o r e .* /
p r i v a t e b o o l e a n t h r e a d D o n e = f a l s e ;
/ * *
* N a m e t o r e g i s t e r f o r t h e b a c k g r o u n d t h r e a d .* /
p r i v a t e S t r i n g t h r e a d N a m e = " S t a n d a r d M a n a g e r " ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P r o p e r t i e s
/ * *
* R e t u r n t h e c h e c k i n t e r v a l ( i n s e c o n d s ) f o r t h i s M a n a g e r .* /
p u b l i c i n t g e t C h e c k I n t e r v a l ( ) {
r e t u r n ( t h i s . c h e c k I n t e r v a l ) ;
}
/ * ** S e t t h e c h e c k i n t e r v a l ( i n s e c o n d s ) f o r t h i s M a n a g e r .
*
* @p a r a m checkInterval T h e n e w c h e c k i n t e r v a l* /
p u b l i c v o i d s e t C h e c k I n t e r v a l ( i n t c h e c k I n t e r v a l) {
t h i s . c h e c k I n t e r v a l = c h e c k I n t e r v a l ;
}
/ * ** R e t u r n d e s c r i p t i v e i n f o r m a t i o n a b o u t t h i s M a n a g e r i m p l e m e ntation and
* t h e c o r r e s p o n d i n g v e r s i o n n u m b e r , i n t h e f o r m a t
* < c o d e > &l t ; d e s c r i p t i o n & g t ; / & l t ; v e r s i o n & g t ; < / c o d e > .* /
p u b l i c S t r i n g g e t I n f o () {
return (this.info);
}
/ * ** R e t u r n t h e m a x i m u m n u m b e r o f a c t i v e S e s s i o n s a l l o w e d , o r - 1 for
* no limit.
* /p u b l i c i n t g e t M a x A c t i v e S e s s i o n s () {
r e t u r n ( t h i s . m a x A c t i v e S e s s i o n s) ;
}
/ * *
* S e t t h e m a x i m u m n u m b e r o f a c t i v e s S e s s i o n s a l l o w e d , o r - 1 f o r* no limit.
*
* @p a r a m m a x T h e n e w m a x i m u m n u m b e r o f s e s s i o n s* /
p u b l i c v o i d s e t M a x A c t i v e S e s s i o n s ( i n t m a x ) {
t h i s . m a x A c t i v e S e s s i o n s = m a x ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P u b l i c M e t h o d s
/ * ** C o n s t r u c t a n d r e t u r n a n e w s e s s i o n o b j e c t , b a s e d o n t h e d e f a u l t
* s e t t i n g s s p e c i f i e d b y t h i s M a n a g e r ' s p r o p e r t i e s . T h e s e s s i o n
* i d w i l l b e a s s i g n e d b y t h i s m e t h o d , a n d a v a i l a b l e v i a t h e g e t I d ( )* m e t h o d o f t h e r e t u r n e d s e s s i o n . I f a n e w s e s s i o n c a n n o t b e c r e a t e d
* f o r a n y r e a s o n , r e t u r n < c o d e > n u l l < / c o d e > .
** @ e x c e p t i o n IllegalStateException i f a n e w s e s s i o n c a n n o t b e
* i n s t a n t i a t e d f o r a n y r e a s o n
* /p u b l i c S e s s i o n c r e a t e S e s s i o n( ) {
i f ( ( m a x A c t i v e S e s s i o n s >= 0) &&( s e s s i o n s . s i z e ( ) > = m a x A c t i v e S e s s i o n s ) )
throw new I l l e g a l S t a t e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . c r e a t e S e s s i o n . i s e " ) ) ;
r e t u r n ( s u p e r . c r e a t e S e s s i o n ());
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - L i f e c y c l e M e t h o d s
/ * *
* C o n f i g u r e t h i s c o m p o n e n t , b a s e d o n t h e s p e c i f i e d c o n f i g u r ation
* p a r a m e t e r s . T h i s m e t h o d s h o u l d b e c a l l e d i m m e d i a t e l y a f t e r t h e* c o m p o n e n t i n s t a n c e i s c r e a t e d , a n d b e f o r e < c o d e > s t a r t ( ) < / code>
* i s c a l l e d .
** @ p a r a m p a r a m e t e r s C o n f i g u r a t i o n p a r a m e t e r s f o r t h i s c o m p o n e n t
* ( < B > F I X M E : W h a t o b j e c t t y p e s h o u l d t h i s r e a l l y b e ? )
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s a l r e a d y b e e n
* c o n f i g u r e d a n d / o r s t a r t e d
* @ e x c e p t i o n L i f e c y c l e E x c e p t i o n i f t h i s c o m p o n e n t d e t e c t s a f a t a l e r r o r* i n t h e c o n f i g u r a t i o n p a r a m e t e r s i t w a s g i v e n
* /
p u b l i c v o i d c o n f i g u r e ( N o d e p a r a m e t e r s )t h r o w s LifecycleException {
/ / V a l i d a t e a n d u p d a t e o u r c u r r e n t c o m p o n e n t s t a t ei f ( c o n f i g u r e d )
throw new L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . a l r e a d y C o n f i g u r e d " ) ) ;c o n f i g u r e d = t r u e ;
i f ( p a r a m e t e r s = = n u l l )
r e t u r n ;
/ / P a r s e a n d p r o c e s s o u r c o n f i g u r a t i o n p a r a m e t e r s
if (!(" M a n a g e r " . e q u a l s ( p a r a m e t e r s . g e t N o d e N a m e ( ) ) ) )r e t u r n ;
N a m e d N o d e M a p a t t r i b u t e s = p a r a m e t e r s . g e t A t t r i b u t e s ( ) ;
N o d e n o d e = n u l l ;
n o d e = a t t r i b u t e s . g e t N a m e d I t e m ( " c h e c k I n t e r v a l " ) ;
i f ( n o d e ! = n u l l ) {try {
s e t C h e c k I n t e r v a l ( I n t e g e r . p a r s e I n t ( n o d e . g e t N o d e V a l u e ( ) ) ) ;
} c a t c h ( T h r o w a b l e t) {; / / X X X - T h r o w e x c e p t i o n ?
}
}
n o d e = a t t r i b u t e s . g e t N a m e d I t e m ( " m a x A c t i v e S e s s i o n s " ) ;
i f ( n o d e ! = n u l l ) {try {
s e t M a x A c t i v e S e s s i o n s ( I n t e g e r . p a r s e I n t ( n o d e . g e t N o d e V a l u e ( ) ) ) ;
} c a t c h ( T h r o w a b l e t) {; / / X X X - T h r o w e x c e p t i o n ?
}
}
n o d e = a t t r i b u t e s . g e t N a m e d I t e m ( " m a x I n a c t i v e I n t e r v a l " ) ;
i f ( n o d e ! = n u l l ) {try {
s e t M a x I n a c t i v e I n t e r v a l ( I n t e g e r . p a r s e I n t ( n o d e . g e t N o d e V a l u e ( ) ) ) ;
} c a t c h ( T h r o w a b l e t ) {; / / X X X - T h r o w e x c e p t i o n ?
}
}
}
/ * *
* P r e p a r e f o r t h e b e g i n n i n g o f a c t i v e u s e o f t h e p u b l i c m e t h o d s o f t h i s
* c o m p o n e n t . T h i s m e t h o d s h o u l d b e c a l l e d a f t e r < c o d e > c o n f i g u r e ( ) < / c o d e > ,* a n d b e f o r e a n y o f t h e p u b l i c m e t h o d s o f t h e c o m p o n e n t a r e u t i l i z e d .
*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s n o t y e t b e e n* c o n f i g u r e d ( i f r e q u i r e d f o r t h i s c o m p o n e n t )
* @ e x c e p t i o n IllegalStateException i f t h i s c o m p o n e n t h a s a l r e a d y b e e n
* started* @ e x c e p t i o n L i f e c y c l e E x c e p t i o n i f t h i s c o m p o n e n t d e t e c t s a f a t a l e r r o r
* t h a t p r e v e n t s t h i s c o m p o n e n t f r o m b e i n g u s e d
* /p u b l i c v o i d s t a r t ( ) t h r o w s L i f e c y c l e E x c e p t i o n {
/ / V a l i d a t e a n d u p d a t e o u r c u r r e n t c o m p o n e n t s t a t ei f ( ! c o n f i g u r e d )
throw new L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . n o t C o n f i g u r e d "));i f ( s t a r t e d )
throw new L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . a l r e a d y S t a r t e d "));s t a r t e d = t r u e ;
/ / S t a r t t h e b a c k g r o u n d r e a p e r t h r e a dt h r e a d S t a r t ();
}
/ * ** G r a c e f u l l y t e r m i n a t e t h e a c t i v e u s e o f t h e p u b l i c m e t h o d s o f t h i s
* c o m p o n e n t . T h i s m e t h o d s h o u l d b e t h e l a s t o n e c a l l e d o n a g i v e n
* i n s t a n c e o f t h i s c o m p o n e n t .*
* @ e x c e p t i o n IllegalStateException i f t h i s c o m p o n e n t h a s n o t b e e n s t a r t e d
* @ e x c e p t i o n IllegalStateException i f t h i s c o m p o n e n t h a s a l r e a d y* b e e n s t o p p e d
* @ e x c e p t i o n L i f e c y c l e E x c e p t i o n i f t h i s c o m p o n e n t d e t e c t s a f a t a l e r r o r
* that needs to be reported* /
p u b l i c v o i d s t o p ( ) t h r o w s L i f e c y c l e E x c e p t i o n {
/ / V a l i d a t e a n d u p d a t e o u r c u r r e n t c o m p o n e n t s t a t e
if (!started)
throw new L i f e c y c l e E x c e p t i o n( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . n o t S t a r t e d " ) ) ;
s t a r t e d = f a l s e ;
/ / S t o p t h e b a c k g r o u n d r e a p e r t h r e a d
t h r e a d S t o p ();
/ / E x p i r e a l l a c t i v e s e s s i o n s
S e s s i o n s e s s i o n s [ ] = f i n d S e s s i o n s ( ) ;
f o r ( int i = 0 ; i < s e s s i o n s . l e n g t h ; i + + ) {StandardSession session = ( S t a n d a r d S e s s i o n ) s e s s i o n s [ i ] ;
if (!s e s s i o n . i s V a l i d( ) )
c o n t i n u e ;s e s s i o n . e x p i r e ( ) ;
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P r i v a t e M e t h o d s
/ * *
* I n v a l i d a t e a l l s e s s i o n s t h a t h a v e e x p i r e d .
* /p r i v a t e v o i d p r o c e s s E x p i r e s ( ) {
l o n g t i m e N o w = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ;S e s s i o n s e s s i o n s [ ] = f i n d S e s s i o n s ( ) ;
f o r ( i n t i = 0 ; i < s e s s i o n s . l e n g t h ; i + + ) {S t a n d a r d S e s s i o n s e s s i o n = ( S t a n d a r d S e s s i o n ) s e s s i o n s [ i ] ;
i f ( ! s e s s i o n . i s V a l i d ( ) )
c o n t i n u e ;i n t m a x I n a c t i v e I n t e r v a l = s e s s i o n . g e t M a x I n a c t i v e I n t e r v a l ( ) ;
i f ( m a x I n a c t i v e I n t e r v a l < 0 )
c o n t i n u e ;i n t t i m e I d l e = / / T r u n c a t e , d o n o t r o u n d u p
( i n t ) ( ( t i m e N o w - s e s s i o n . g e t L a s t A c c e s s e d T i m e ( ) ) / 1 0 0 0 L ) ;
if (t i m e I d l e >= m a x I n a c t i v e I n t e r v a l )session.expire();
}
}
/ * ** S l e e p f o r t h e d u r a t i o n s p e c i f i e d b y t h e < c o d e > c h e c k I n t e r v a l < / c o d e >
* p r o p e r t y .
* /p r i v a t e v o i d t h r e a d S l e e p ( ) {
t r y {T h r e a d . s l e e p ( c h e c k I n t e r v a l * 1 0 0 0 L ) ;
} c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {
;}
}
/ * ** S t a r t t h e b a c k g r o u n d t h r e a d t h a t w i l l p e r i o d i c a l l y c h e c k f o r
* s e s s i o n t i m e o u t s .
* /p r i v a t e v o i d t h r e a d S t a r t ( ) {
if (thread != null)r e t u r n ;
t h r e a d D o n e = false;t h r e a d = n e w T h r e a d ( t h i s , t h r e a d N a m e) ;
t h r e a d . s e t D a e m o n ( t r u e ) ;
t h r e a d . s t a r t ( ) ;
}
/ * *
* S t o p t h e b a c k g r o u n d t h r e a d t h a t i s p e r i o d i c a l l y c h e c k i n g f o r* s e s s i o n t i m e o u t s .
* /
p r i v a t e v o i d threadStop ( ) {
if (thread == null)
r e t u r n ;
t h r e a d D o n e = t r u e ;
t h r e a d . i n t e r r u p t ( ) ;t r y {
t h r e a d . j o i n ( ) ;
} c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {;
}
t h r e a d = n u l l ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - B a c k g r o u n d T h r e a d
/ * ** T h e b a c k g r o u n d t h r e a d t h a t c h e c k s f o r s e s s i o n t i m e o u t s a n d shutdown.
* /
p u b l i c v o i d r u n ( ) {
/ / L o o p u n t i l t h e t e r m i n a t i o n s e m a p h o r e i s s e t
w h i l e ( ! t h r e a d D o n e) {t h r e a d S l e e p ( ) ;
p r o c e s s E x p i r e s( ) ;
}
StandardManager
StandardSessionManagerp a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t j a v a . i o . I O E x c e p t i o n ;
i m p o r t j a v a x . s e r v l e t . h t t p . C o o k i e ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . c a t a l i n a . * ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . C o n t e x t ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . R e q u e s t ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . R e s p o n s e ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . S e s s i o n M a n a g e r ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S e s s i o n U t i l ;
/ * *
* S p e c i a l i z e d i m p l e m e n t a t i o n o f o r g . a p a c h e . t o m c a t . c o r e . S e s s i o n M a n a g e r
* t h a t a d a p t s t o t h e n e w c o m p o n e n t - b a s e d M a n a g e r i m p l e m e n t a t i o n .
* < p >
* X X X - A t p r e s e n t , u s e o f < c o d e > S t a n d a r d M a n a g e r < / c o d e > i s h a r d c o d e d ,
* a n d l i f e c y c l e c o n f i g u r a t i o n i s n o t s u p p o r t e d .
* < p >
* < b > I M P L E M E N T A T I O N N O T E < / b > : O n c e w e c o m m i t t o t h e n e w M a n a g e r / S e s s i o n
* p a r a d i g m , I w o u l d s u g g e s t m o v i n g t h e l o g i c i m p l e m e n t e d h e r e b a c k i n t o
* t h e c o r e l e v e l . T h e T o m c a t . N e x t " M a n a g e r " i n t e r f a c e a c t s m o r e l i k e a
* c o l l e c t i o n c l a s s , a n d h a s m i n i m a l k n o w l e d g e o f t h e d e t a i l e d r e q u e s t
* p r o c e s s i n g s e m a n t i c s o f h a n d l i n g s e s s i o n s .
* < p >
* X X X - A t p r e s e n t , t h e r e i s n o w a y ( v i a t h e S e s s i o n M a n a g e r i n t e r f a c e )
f o r
* a C o n t e x t t o t e l l t h e M a n a g e r t h a t w e c r e a t e w h a t t h e d e f a u l t s e s s i o n
* t i m e o u t f o r t h i s w e b a p p l i c a t i o n ( s p e c i f i e d i n t h e d e p l o y m e n t
d e s c r i p t o r )
* s h o u l d b e .
*
* @ a u t h o r C r a i g R . M c C l a n a h a n
* /
p u b l i c f i n a l c l a s s S t a n d a r d S e s s i o n M a n a g e r
i m p l e m e n t s S e s s i o n M a n a g e r {
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -C o n s t r u c t o r s
/ * *
* C r e a t e a n e w S e s s i o n M a n a g e r t h a t a d a p t s t o t h e c o r r e s p o n d i n g
M a n a g e r
* i m p l e m e n t a t i o n .
* /
p u b l i c StandardSessionManager ( ) {
m a n a g e r = n e w S t a n d a r d M a n a g e r ();
i f ( m a n a g e r i n s t a n c e o f L i f e c y c l e ) {
try {
( ( L i f e c y c l e ) m a n a g e r ) . c o n f i g u r e ( n u l l ) ;
( ( L i f e c y c l e ) m a n a g e r ) . s t a r t ( ) ;
} c a t c h ( LifecycleException e ) {
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( " " + e ) ;
}
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Instance
Variables
/ * *
* T h e M a n a g e r i m p l e m e n t a t i o n w e a r e a c t u a l l y u s i n g .
* /
p r i v a t e M a n a g e r m a n a g e r = n u l l ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P u b l i c M e t h o d s
/ * *
* M a r k t h e s p e c i f i e d s e s s i o n ' s l a s t a c c e s s e d t i m e . T h i s s h o u l d b e
* c a l l e d f o r e a c h r e q u e s t b y a R e q u e s t I n t e r c e p t o r .
*
* @ p a r a m s e s s i o n T h e s e s s i o n t o b e m a r k e d
* /
p u b l i c v o i d a c c e s s e d ( C o n t e x t c t x , R e q u e s t r e q , S t r i n g i d ) {
H t t p S e s s i o n s e s s i o n = f i n d S e s s i o n ( c t x , i d ) ;
i f ( s e s s i o n = = n u l l ) r e t u r n ;
i f ( s e s s i o n i n s t a n c e o f S e s s i o n )
( ( S e s s i o n ) s e s s i o n ) . a c c e s s ( ) ;
/ / c a c h e t h e H t t p S e s s i o n - a v o i d a n o t h e r f i n d
r e q . s e t S e s s i o n ( s e s s i o n ) ;
}
/ / X X X s h o u l d w e t h r o w e x c e p t i o n o r j u s t r e t u r n n u l l ? ?
p u b l i c H t t p S e s s i o n f i n d S e s s i o n ( C o n t e x t c t x , S t r i n g i d ) {
t r y {
S e s s i o n s e s s i o n = m a n a g e r . f i n d S e s s i o n ( i d ) ;
i f ( s e s s i o n ! = n u l l )
r e t u r n s e s s i o n . g e t S e s s i o n ( ) ;
} c a t c h ( I O E x c e p t i o n e) {
}
r e t u r n ( n u l l ) ;
}
p u b l i c H t t p S e s s i o n c r e a t e S e s s i o n ( C o n t e x t c t x ) {
r e t u r n m a n a g e r . c r e a t e S e s s i o n ( ) . g e t S e s s i o n( ) ;
}
/ * *
* R e m o v e a l l s e s s i o n s b e c a u s e o u r a s s o c i a t e d C o n t e x t i s b e i n g s h u t d o w n .
*
* @p a r a m c t x T h e c o n t e x t t h a t i s b e i n g s h u t d o w n
* /
p u b l i c v o i d r e m o v e S e s s i o n s ( C o n t e x t c t x ) {
/ / X X X X X X a m a n a g e r m a y b e s h a r e d b y m u l t i p l e
/ / c o n t e x t s , w e j u s t w a n t t o r e m o v e t h e s e s s i o n s o f ctx !
/ / T h e m a n a g e r w i l l s t i l l r u n a f t e r t h a t ( i . e . k e e p d a t abase
/ / c o n n e c t i o n o p e n
i f ( m a n a g e r i n s t a n c e o f L i f e c y c l e ) {
try {
( ( L i f e c y c l e ) m a n a g e r ) . s t o p ( ) ;
} c a t c h ( LifecycleException e ) {
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( " " + e ) ;
}
}
}
/ * *
* U s e d b y c o n t e x t t o c o n f i g u r e t h e s e s s i o n m a n a g e r ' s i n a c t i vity
t i m e o u t .
*
* The S e s s i o n M a n a g e r m a y h a v e s o m e d e f a u l t s e s s i o n t i m e o u t , t h e
* C o n t e x t o n t h e o t h e r h a n d h a s i t ' s t i m e o u t s e t b y t h e d e p l o y m e n t
* d e s c r i p t o r ( w e b . x m l) . T h i s m e t h o d l e t s t h e C o n t e x t c o n f o r g u r e t h e
* s e s s i o n m a n a g e r a c c o r d i n g t o t h i s v a l u e .
*
* @p a r a m m i n u t e s T h e s e s s i o n i n a c t i v i t y t i m e o u t i n m i n u t e s .
* /
p u b l i c v o i d s e t S e s s i o n T i m e O u t ( i n t m i n u t e s ) {
i f ( - 1 ! = m i n u t e s ) {
/ / T h e m a n a g e r w o r k s w i t h s e c o n d s . . .
m a n a g e r . s e t M a x I n a c t i v e I n t e r v a l ( m i n u t e s * 60);
}
}
}
ServerSessionManagerp a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . * ;i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;
i m p o r t j a v a . i o . * ;
i m p o r t j a v a . n e t . * ;i m p o r t j a v a . u t i l . * ;
i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * *
*
* @ a u t h o r J a m e s D u n c a n D a v i d s o n [ d u n c a n @ e n g . s u n . c o m ]* @ a u t h o r J a s o n H u n t e r [ j c h @ e n g . s u n . c o m ]
* @ a u t h o r J a m e s T o d d [ g o n z o @ e n g . s u n . c o m ]
* /
p u b l i c c l a s s S e r v e r S e s s i o n M a n a g e r i m p l e m e n t s S e s s i o n M a n a g e r {
p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;
p r i v a t e s t a t i c S e r v e r S e s s i o n M a n a g e r m a n a g e r ; / / = n e w S e r v e r SessionManager();
p r o t e c t e d i n t i n a c t i v e I n t e r v a l = -1 ;
s t a t i c {
m a n a g e r = n e w S e r v e r S e s s i o n M a n a g e r ();
}
p u b l i c s t a t i c S e r v e r S e s s i o n M a n a g e r g e t M a n a g e r () {
r e t u r n m a n a g e r ;}
p r i v a t e Hashtable s e s s i o n s = n e w Hashtable( ) ;p r i v a t e R e a p e r r e a p e r ;
p r i v a t e S e r v e r S e s s i o n M a n a g e r( ) {r e a p e r = Reaper.getReaper ( ) ;
r e a p e r . s e t S e r v e r S e s s i o n M a n a g e r ( t h i s );
r e a p e r . s t a r t ( ) ;}
p u b l i c v o i d a c c e s s e d ( C o n t e x t c t x , R e q u e s t r e q , S t r i n g i d ) {A p p l i c a t i o n S e s s i o n a p S = ( A p p l i c a t i o n S e s s i o n ) f i n d S e s s i o n ( c t x , i d ) ;
i f ( a p S = = n u l l ) r e t u r n ;
S e r v e r S e s s i o n s e r v S = a p S . g e t S e r v e r S e s s i o n ( ) ;
s e r v S . a c c e s s e d ( ) ;
a p S . a c c e s s e d ( ) ;
/ / c a c h e i t - n o n e e d t o c o m p u t e i t a g a i n
r e q . s e t S e s s i o n ( a p S ) ;}
p u b l i c H t t p S e s s i o n c r e a t e S e s s i o n ( C o n t e x t c t x ) {S t r i n g s e s s i o n I d = S e s s i o n I d G e n e r a t o r . g e n e r a t e I d ( ) ;
S e r v e r S e s s i o n s e s s i o n = n e w S e r v e r S e s s i o n ( s e s s i o n I d ) ;
s e s s i o n s . p u t ( s e s s i o n I d , s e s s i o n ) ;
i f ( - 1 ! = i n a c t i v e I n t e r v a l ) {
s e s s i o n . s e t M a x I n a c t i v e I n t e r v a l ( i n a c t i v e I n t e r v a l );}
r e t u r n s e s s i o n . g e t A p p l i c a t i o n S e s s i o n( c t x , t r u e ) ;
}
p u b l i c H t t p S e s s i o n f i n d S e s s i o n ( C o n t e x t ctx, S t r i n g i d ) {
ServerSession s S e s s i o n = (S e r v e r S e s s i o n ) s e s s i o n s . g e t ( i d );i f ( s S e s s i o n ==null) return null;
r e t u r n s S e s s i o n . g e t A p p l i c a t i o n S e s s i o n ( c t x , false);}
/ / X X X/ / s y n c ' d f o r s a f t y - - n o o t h e r t h r e a d s h o u l d b e g e t t i n g s o m e t h i n g
/ / f r o m t h i s w h i l e w e a r e r e a p i n g . T h i s i s n ' t t h e m o s t o p t i m a l
/ / s o l u t i o n f o r t h i s , b u t w e ' l l d e t e r m i n e s o m e t h i n g e l s e l a t e r .
s y n c h r o n i z e d v o i d r e a p ( ) {
E n u m e r a t i o n e n u m = s e s s i o n s . k e y s ( ) ;
w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {
O b j e c t k e y = e n u m . n e x t E l e m e n t ( ) ;S e r v e r S e s s i o n s e s s i o n = ( S e r v e r S e s s i o n ) s e s s i o n s . g e t ( key);
session.reap();s e s s i o n . v a l i d a t e ( ) ;
}
}
s y n c h r o n i z e d v o i d r e m o v e S e s s i o n ( S e r v e r S e s s i o n s e s s i o n ) {
S t r i n g i d = s e s s i o n . g e t I d ( ) ;
s e s s i o n . i n v a l i d a t e ( ) ;
s e s s i o n s . r e m o v e ( i d ) ;}
p u b l i c v o i d r e m o v e S e s s i o n s ( C o n t e x t c o n t e x t ) {E n u m e r a t i o n e n u m = s e s s i o n s . k e y s ( ) ;
w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {O b j e c t k e y = e n u m . n e x t E l e m e n t ( ) ;
S e r v e r S e s s i o n s e s s i o n = ( S e r v e r S e s s i o n ) s e s s i o n s . g e t ( key);
A p p l i c a t i o n S e s s i o n a p p S e s s i o n =s e s s i o n . g e t A p p l i c a t i o n S e s s i o n ( c o n t e x t , f a l s e ) ;
i f ( a p p S e s s i o n ! = n u l l ) {a p p S e s s i o n . i n v a l i d a t e ( ) ;
}
}}
/ * ** U s e d b y c o n t e x t t o c o n f i g u r e t h e s e s s i o n m a n a g e r ' s i n a c t i v i t y t i m e o u t .
*
* T h e S e s s i o n M a n a g e r m a y h a v e s o m e d e f a u l t s e s s i o n t i m e o u t , the* C o n t e x t o n t h e o t h e r h a n d h a s i t ' s t i m e o u t s e t b y t h e d e p l o y m e n t
* d e s c r i p t o r ( w e b . x m l ) . T h i s m e t h o d l e t s t h e C o n t e x t c o n f o r g u r e t h e
* s e s s i o n m a n a g e r a c c o r d i n g t o t h i s v a l u e .*
* @ p a r a m m i n u t e s T h e s e s s i o n i n a c t i v i t y t i m e o u t i n m i n u t e s .
* /p u b l i c v o i d s e t S e s s i o n T i m e O u t ( i n t m i n u t e s ) {
i f ( - 1 ! = m i n u t e s ) {
/ / T h e m a n a g e r w o r k s w i t h s e c o n d s . . .i n a c t i v e I n t e r v a l = ( m i n u t e s * 6 0 ) ;
}
}}
SessionInterceptorp a c k a g e o r g . a p a c h e . t o m c a t . r e q u e s t ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;i m p o r t o r g . a p a c h e . t o m c a t . u t i l . * ;
i m p o r t j a v a . i o . * ;
i m p o r t j a v a . n e t . * ;i m p o r t j a v a . u t i l . * ;
i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * *
* W i l l p r o c e s s t h e r e q u e s t a n d d e t e r m i n e t h e s e s s i o n I d , a n d s e t i t
* i n t h e R e q u e s t .* I t a l s o m a r k s t h e s e s s i o n a s a c c e s s e d .
*
* T h i s i m p l e m e n t a t i o n o n l y h a n d l e s C o o k i e s s e s s i o n s , p l e a s e e x t e n d o r* a d d n e w i n t e r c e p t o r s f o r o t h e r m e t h o d s .
*
* /p u b l i c c l a s s S e s s i o n I n t e r c e p t o r e x t e n d s B a s e I n t e r c e p t o r i m p l e m e n t s R e q u e s t I n t e r c e p t o r {
/ / G S , s e p a r a t e s t h e s e s s i o n i d f r o m t h e j v m r o u t es t a t i c f i n a l c h a r S E S S I O N I D _ R O U T E _ S E P = ' . ' ;
i n t d e b u g = 0 ;
C o n t e x t M a n a g e r c m ;
p u b l i c S e s s i o n I n t e r c e p t o r ( ) {
}
p u b l i c v o i d s e t D e b u g ( i n t i ) {
S y s t e m . o u t . p r i n t l n ( " S e t d e b u g t o " + i ) ;d e b u g = i ;
}
p u b l i c v o i d s e t C o n t e x t M a n a g e r ( C o n t e x t M a n a g e r c m ) {
t h i s . c m = c m ;
}
p u b l i c i n t r e q u e s t M a p ( R e q u e s t r e q u e s t ) {
S t r i n g s e s s i o n I d = n u l l ;
C o o k i e c o o k i e s [ ] = r e q u e s t . g e t C o o k i e s ( ) ; / / a s s e r t ! = n u l l
f o r ( i n t i = 0 ; i < c o o k i e s . l e n g t h ; i + + ) {
C o o k i e c o o k i e = c o o k i e s [ i ] ;
i f ( c o o k i e . g e t N a m e ( ) . e q u a l s ( " J S E S S I O N I D " ) ) {
s e s s i o n I d = c o o k i e . g e t V a l u e ( ) ;
s e s s i o n I d = v a l i d a t e S e s s i o n I d ( r e q u e s t , s e s s i o n I d ) ;i f ( s e s s i o n I d ! = n u l l ) {
r e q u e s t . s e t R e q u e s t e d S e s s i o n I d F r o m C o o k i e ( t r u e ) ;
}}
}
S t r i n g s i g = " ; j s e s s i o n i d = " ;
i n t f o u n d A t =- 1 ;
i f ( d e b u g > 0 ) c m . l o g ( " X X X R U R I = " + r e q u e s t . g e t R e q u e s t U R I());i f ( ( f o u n d A t = r e q u e s t . g e t R e q u e s t U R I ( ) . i n d e x O f ( s i g ) ) ! = - 1){
s e s s i o n I d = r e q u e s t . g e t R e q u e s t U R I ( ) . s u b s t r i n g ( f o u n d A t + s i g . l e n g t h ( ) ) ;
/ / r e w r i t e U R L , d o I n e e d t o d o a n y t h i n g m o r e ?r e q u e s t . s e t R e q u e s t U R I ( r e q u e s t . g e t R e q u e s t U R I ( ) . s u b s t r ing(0, foundAt));
s e s s i o n I d = v a l i d a t e S e s s i o n I d ( r e q u e s t , s e s s i o n I d ) ;
if (sessionId!=null){r e q u e s t . s e t R e q u e s t e d S e s s i o n I d F r o m U R L ( t r u e ) ;
}
}r e t u r n 0 ;
}
/ / X X X w h a t i s t h e c o r r e c t b e h a v i o r i f t h e s e s s i o n i s i n v a l i d ?
/ / W e m a y s t i l l s e t i t a n d j u s t r e t u r n s e s s i o n i n v a l i d .
/ * * V a l i d a t e a n d f i x t h e s e s s i o n i d . I f t h e s e s s i o n i s n o t v alid return null.
* It will also clean up the session from load - b a l a n c i n g s t r i n g s .
* @ r e t u r n s e s s i o n I d , o r n u l l i f n o t v a l i d* /
p r i v a t e S t r i n g v a l i d a t e S e s s i o n I d ( R e q u e s t r e q u e s t , S t r i n g s e s s i o n I d ) {
/ / G S , W e p i g g y b a c k t h e J V M i d o n t o p o f t h e s e s s i o n c o o k i e/ / S e p a r a t e t h e m . . .
i f ( d e b u g > 0 ) c m . l o g ( " O r i g s e s s i o n I d " + s e s s i o n I d ) ;i f ( n u l l ! = s e s s i o n I d ) {
i n t i d e x = s e s s i o n I d . l a s t I n d e x O f ( S E S S I O N I D _ R O U T E _ S E P ) ;
i f ( i d e x > 0 ) {s e s s i o n I d = s e s s i o n I d . s u b s t r i n g ( 0 , i d e x ) ;
}
}
i f ( s e s s i o n I d ! = n u l l & & s e s s i o n I d . l e n g t h ( ) ! = 0 ) {
/ / G S , W e a r e i n a p r o b l e m h e r e , w e m a y a c t u a l l y g e t/ / m u l t i p l e S e s s i o n c o o k i e s ( o n e f o r t h e r o o t
/ / c o n t e x t a n d o n e f o r t h e r e a l c o n t e x t . . . o r o l d s e ssion
/ / c o o k i e . W e m u s t c h e c k f o r v a l i d i t y i n t h e c u r r e n t c o n t e x t .C o n t e x t c t x = r e q u e s t . g e t C o n t e x t ( ) ;
S e s s i o n M a n a g e r s M = c t x . g e t S e s s i o n M a n a g e r ( ) ;
i f ( n u l l ! = s M . f i n d S e s s i o n ( c t x , s e s s i o n I d ) ) {s M . a c c e s s e d ( c t x , r e q u e s t , s e s s i o n I d ) ;
r e q u e s t . s e t R e q u e s t e d S e s s i o n I d ( s e s s i o n I d ) ;
i f ( d e b u g > 0 ) c m . l o g ( " F i n a l s e s s i o n i d " + s e s s i o n I d ) ;return sessionId;
}
}r e t u r n n u l l ;
}
p u b l i c i n t b e f o r e B o d y ( R e q u e s t r r e q u e s t , R e s p o n s e r e s p o n s e ) {
S t r i n g r e q S e s s i o n I d = r e s p o n s e . g e t S e s s i o n I d ( ) ;i f ( d e b u g > 0 ) c m . l o g ( " B e f o r e B o d y " + r e q S e s s i o n I d ) ;
i f ( r e q S e s s i o n I d = = n u l l )
return 0;
/ / G S , s e t t h e p a t h a t t r i b u t e t o t h e c o o k i e . T h i s w a y/ / m u l t i p l e s e s s i o n c o o k i e s c a n b e u s e d , o n e f o r e a c h
/ / c o n t e x t .
S t r i n g s e s s i o n P a t h = r r e q u e s t . g e t C o n t e x t ( ) . g e t P a t h ( ) ;i f ( s e s s i o n P a t h . l e n g t h ( ) = = 0 ) {
s e s s i o n P a t h = " / " ;
}
// GS, piggyback the jvm route on the session id.
i f ( ! s e s s i o n P a t h . e q u a l s ( " / " ) ) {S t r i n g j v m R o u t e = r r e q u e s t . g e t J v m R o u t e ( ) ;
i f ( n u l l ! = j v m R o u t e ) {
r e q S e s s i o n I d = r e q S e s s i o n I d + S E S S I O N I D _ R O U T E _ S E P + j v m R o u t e ;}
}
C o o k i e c o o k i e = n e w C o o k i e ( " J S E S S I O N I D " ,
r e q S e s s i o n I d ) ;
c o o k i e . s e t M a x A g e ( -1 ) ;c o o k i e . s e t P a t h ( s e s s i o n P a t h ) ;
c o o k i e . s e t V e r s i o n ( 1 ) ;
r e s p o n s e . a d d H e a d e r ( C o o k i e T o o l s . g e t C o o k i e H e a d e r N a m e ( c o o k i e ) ,
C o o k i e T o o l s . g e t C o o k i e H e a d e r V a l u e ( c o o k i e ) ) ;
c o o k i e . s e t V e r s i o n ( 0 ) ;r e s p o n s e . a d d H e a d e r ( C o o k i e T o o l s . g e t C o o k i e H e a d e r N a m e ( c o o k i e ) ,
C o o k i e T o o l s . g e t C o o k i e H e a d e r V a l u e ( c o o k i e ) ) ;
r e t u r n 0 ;
}
/ * * N o t i f i c a t i o n o f c o n t e x t s h u t d o w n
* /p u b l i c v o i d c o n t e x t S h u t d o w n ( C o n t e x t c t x )
t h r o w s T o m c a t E x c e p t i o n
{i f ( c t x . g e t D e b u g ( ) > 0 ) c t x . l o g ( " R e m o v i n g s e s s i o n s f r o m " + ctx );
c t x . g e t S e s s i o n M a n a g e r ( ) . r e m o v e S e s s i o n s ( c t x ) ;
}
}ServerSessionp a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;i m p o r t j a v a . i o . * ;
i m p o r t j a v a . n e t . * ;
i m p o r t j a v a . u t i l . * ;i m p o r t j a v a x . s e r v l e t . * ;
i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * *
* C o r e i m p l e m e n t a t i o n o f a s e r v e r s e s s i o n
** @ a u t h o r J a m e s D u n c a n D a v i d s o n [ d u n c a n @ e n g . s u n . c o m ]
* @ a u t h o r J a m e s T o d d [ g o n z o @ e n g . s u n . c o m ]
* /
p u b l i c c l a s s S e r v e r S e s s i o n {
p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;
p r i v a t e H a s h t a b l e v a l u e s = n e w H a s h t a b l e ( ) ;p r i v a t e H a s h t a b l e a p p S e s s i o n s = n e w H a s h t a b l e ( ) ;
p r i v a t e S t r i n g i d ;
p r i v a t e l o n g c r e a t i o n T i m e = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ; ;p r i v a t e l o n g t h i s A c c e s s T i m e = c r e a t i o n T i m e ;
p r i v a t e l o n g l a s t A c c e s s e d = c r e a t i o n T i m e ;
p r i v a t e i n t i n a c t i v e I n t e r v a l = - 1 ;
S e r v e r S e s s i o n ( S t r i n g i d ) {
this.id = id;}
p u b l i c S t r i n g g e t I d ( ) {r e t u r n i d ;
}
p u b l i c l o n g g e t C r e a t i o n T i m e ( ) {
r e t u r n c r e a t i o n T i m e ;
}
p u b l i c l o n g g e t L a s t A c c e s s e d T i m e ( ) {
r e t u r n l a s t A c c e s s e d ;}
p u b l i c A p p l i c a t i o n S e s s i o n g e t A p p l i c a t i o n S e s s i o n ( C o n t e x t c o n t e x t ,b o o l e a n c r e a t e ) {
A p p l i c a t i o n S e s s i o n a p p S e s s i o n =
( A p p l i c a t i o n S e s s i o n ) a p p S e s s i o n s . g e t ( c o n t e x t ) ;
i f ( a p p S e s s i o n = = n u l l & & c r e a t e ) {
/ / X X X
/ / s y n c t o e n s u r e v a l i d ?
a p p S e s s i o n = n e w A p p l i c a t i o n S e s s i o n ( i d , t h i s , c o n t e x t ) ;
a p p S e s s i o n s . p u t ( c o n t e x t , a p p S e s s i o n ) ;
}
/ / X X X
/ / m a k e s u r e t h a t w e h a v e n ' t g o n e o v e r t h e e n d o f o u r/ / i n a c t i v e i n t e r v a l - - i f s o , i n v a l i d a t e a n d c r e a t e
// a new appSession
r e t u r n a p p S e s s i o n ;
}
v o i d r e m o v e A p p l i c a t i o n S e s s i o n ( C o n t e x t c o n t e x t ) {
a p p S e s s i o n s . r e m o v e ( c o n t e x t ) ;
}
/ * *
* C a l l e d b y c o n t e x t w h e n r e q u e s t c o m e s i n s o t h a t a c c e s s e s a n d* i n a c t i v i t i e s c a n b e d e a l t w i t h a c c o r d i n g l y .
* /
v o i d a c c e s s e d ( ) {
/ / s e t l a s t a c c e s s e d t o t h i s A c c e s s T i m e a s i t w i l l b e l e f t o v e r
/ / f r o m t h e p r e v i o u s a c c e s s
l a s t A c c e s s e d = t h i s A c c e s s T i m e ;
t h i s A c c e s s T i m e = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ;
}
v o i d v a l i d a t e ( )
v o i d v a l i d a t e ( ) {/ / i f w e h a v e a n i n a c t i v e i n t e r v a l , c h e c k t o s e e i f
/ / w e ' v e e x c e e d e d i t
i f ( i n a c t i v e I n t e r v a l ! = - 1 ) {
i n t t h i s I n t e r v a l =
( i n t ) ( S y s t e m . c u r r e n t T i m e M i l l i s ( ) - l a s t A c c e s s e d ) / 1 0 0 0 ;
i f ( t h i s I n t e r v a l > i n a c t i v e I n t e r v a l ) {
i n v a l i d a t e ( ) ;
S e r v e r S e s s i o n M a n a g e r s s m =
S e r v e r S e s s i o n M a n a g e r . g e t M a n a g e r ( ) ;
s s m . r e m o v e S e s s i o n ( t h i s ) ;
}}
}
s y n c h r o n i z e d v o i d i n v a l i d a t e ( ) {
E n u m e r a t i o n e n u m = a p p S e s s i o n s . k e y s ( ) ;
w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {
O b j e c t k e y = e n u m . n e x t E l e m e n t ( ) ;
A p p l i c a t i o n S e s s i o n a p p S e s s i o n =( A p p l i c a t i o n S e s s i o n ) a p p S e s s i o n s . g e t ( k e y ) ;
a p p S e s s i o n . i n v a l i d a t e ( ) ;}
}
p u b l i c v o i d p u t V a l u e ( S t r i n g n a m e , O b j e c t v a l u e ) {
i f ( n a m e = = n u l l ) {
S t r i n g m s g = s m . g e t S t r i n g ( " s e r v e r S e s s i o n . v a l u e . i a e " ) ;
t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( m s g ) ;
}
r e m o v e V a l u e ( n a m e ) ; / / r e m o v e a n y e x i s t i n g b i n d i n g
v a l u e s . p u t ( n a m e , v a l u e ) ;}
p u b l i c O b j e c t getValue(String n a m e ) {i f ( n a m e = = n u l l ) {
S t r i n g msg = s m . g e t S t r i n g ( " s e r v e r S e s s i o n . v a l u e . i a e" ) ;
throw new I l l e g a l A r g u m e n t E x c e p t i o n ( m s g) ;
}
r e t u r n v a l u e s . g e t ( n a m e ) ;
}
p u b l i c E n u m e r a t i o n g e t V a l u e N a m e s () {
r e t u r n v a l u e s . k e y s ( ) ;
}
p u b l i c v o i d r e m o v e V a l u e ( S t r i n g n a m e ) {
v a l u e s . r e m o v e ( n a m e ) ;}
p u b l i c v o i d s e t M a x I n a c t i v e I n t e r v a l ( i n t i n t e r v a l ) {i n a c t i v e I n t e r v a l = i n t e r v a l ;
}
p u b l i c i n t g e t M a x I n a c t i v e I n t e r v a l () {
r e t u r n i n a c t i v e I n t e r v a l ;
}
/ / X X X
/ / s y n c ' d f o r s a f t y - - n o o t h e r t h r e a d s h o u l d b e g e t t i n g s o m e t h i n g/ / f r o m t h i s w h i l e w e a r e r e a p i n g . T h i s i s n ' t t h e m o s t o p t i m a l
/ / s o l u t i o n f o r t h i s , b u t w e ' l l d e t e r m i n e s o m e t h i n g e l s e l a t e r .
s y n c h r o n i z e d v o i d r e a p ( ) {
E n u m e r a t i o n e n u m = a p p S e s s i o n s . k e y s ();
w h i l e ( e n u m . h a s M o r e E l e m e n t s ()) {
O b j e c t k e y = e n u m . n e x t E l e m e n t ( ) ;
A p p l i c a t i o n S e s s i o n a p p S e s s i o n =( A p p l i c a t i o n S e s s i o n ) a p p S e s s i o n s . g e t ( k e y );
a p p S e s s i o n . v a l i d a t e ();}
}
}
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
16
5. Rastreo de las sesiones no modular
Problemas derivados de la mezcla de incumbenciasIntroducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
SessionInterceptor
requestMap(request)beforeBody(req, resp)...
SessiongetAttribute(name)setAttribute(name, val)invalidate()...
getCookies()getRequestURI()(doc)getSession()getRequestedSessionId()...
HTTPRequest
HTTPResponse
Servlet
getRequest()setContentType(contentType)getOutptutStream()setSessionId(id)...
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
17
• Código difícil y complejo– Todos los asuntos están mezclados en el mismo sitio, al mismo
tiempo• Código redundante
– El mismo fragmento de código aparece en varios sitios• Dificultad para razonar acerca del código
– No tiene una estructura explícita– La idea general del código enredado no es clara
• Difícil de mantener y modificar– Hay que encontrar todo el código involucrado– Y asegurarse de cambiarlo consistentemente
• En lo que respecta a OO, produce anomalía de la herencia• Y por tanto, tenemos
– Trazabilidad pobre– Productividad baja– Menos posibilidad de reutilizar el código– Pobre calidad del código– Difícil evolución
Consecuencias de la mezcla de incumbencias: lo que tenemos
Introducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
18
• Buena modularidad– Separación: La implantación de
una incumbencia puede ser tratado como una entidad relativamente separada
– Localización: La implantación de una incumbencia aparece en una parte del programa
– Modularización: Todo lo anterior, además de tener una interfaz clara y bien definida para el resto del sistema.
Problemas derivados de la mezcla de incumbencias: Lo que buscamos
Introducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
p r i v a t e l o n g l a s t A c c e s s e d = c r e a t i o n T i m e ;
p r i v a t e i n t i n a c t i v e I n t e r v a l = - 1 ;
v o i d a c c e s s e d ( ) {
/ / s e t l a s t a c c e s s e d t o t h i s A c c e s s T i m e a s i t w i l l b e l e f t o v e r/ / f r o m t h e p r e v i o u s a c c e s s
l a s t A c c e s s e d = t h i s A c c e s s T i m e ;
t h i s A c c e s s T i m e = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ;
v a l i d a t e ( ) ;
}
v o i d v a l i d a t e ( ) {
/ / i f w e h a v e a n i n a c t i v e i n t e r v a l , c h e c k t o s e e i f w e ' v e exceeded i t
i f ( i n a c t i v e I n t e r v a l ! = - 1 ) {
i n t t h i s I n t e r v a l =( i n t ) ( S y s t e m . c u r r e n t T i m e M i l l i s ( ) - l a s t A c c e s s e d ) / 1 0 0 0 ;
i f ( t h i s I n t e r v a l > i n a c t i v e I n t e r v a l ) {i n v a l i d a t e ( ) ;
}
}}
p u b l i c l o n g g e t L a s t A c c e s s e d T i m e ( ) {i f ( v a l i d ) {
r e t u r n l a s t A c c e s s e d ;
} e l s e {S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;}
}
p u b l i c l o n g g e t L a s t A c c e s s e d T i m e( ) {
r e t u r n lastAccessed ;}
p r i v a t e l o n g l a s t A c c e s s e d = c r e a t i o n T i m e ;
v o i d a c c e s s e d ( ) {/ / s e t l a s t a c c e s s e d t o t h i s A c c e s s T i m e a s i t w i l l b e l e f t o v e r
/ / f r o m t h e p r e v i o u s a c c e s s
l a s t A c c e s s e d = t h i s A c c e s s T i m e ;
t h i s A c c e s s T i m e = S y s t e m . c u r r e n t T i m e M i l l i s ();
}
i f ( i n a c t i v e I n t e r v a l ! = - 1) {
i n t t h i s I n t e r v a l =( i n t ) ( S y s t e m . c u r r e n t T i m e M i l l i s ( ) -
l a s t A c c e s s e d ) / 1 0 0 0 ;
i f ( t h i s I n t e r v a l > i n a c t i v e I n t e r v a l ) {
i n v a l i d a t e ( ) ;
S e r v e r S e s s i o n M a n a g e r s s m =
S e r v e r S e s s i o n M a n a g e r . g e t M a n a g e r ( ) ;
s s m . r e m o v e S e s s i o n ( t h i s ) ;
}
}}
p r i v a t e l o n g l a s t A c c e s s e d T i m e = c r e a t i o n T i m e ;
/ * *
* R e t u r n t h e l a s t t i m e t h e c l i e n t s e n t a r e q u e s t
a s s o c i a t e d w i t h t h i s* s e s s i o n , a s t h e n u m b e r o f m i l l i s e c o n d s s i n c e m i d n i g h t ,
J a n u a r y 1 , 1 9 7 0
* G M T . A c t i o n s t h a t y o u r a p p l i c a t i o n t a k e s , s u c h a s g e t t i n g o r s e t t i n g
* a v a l u e a s s o c i a t e d w i t h t h e s e s s i o n , d o n o t a f f e c t t h e
a c c e s s t i m e .* /
p u b l i c l o n g g e t L a s t A c c e s s e d T i m e ( ) {
r e t u r n ( t h i s . l a s t A c c e s s e d T i m e ) ;
}
t h i s . l a s t A c c e s s e d T i m e = t i m e ;
;
/ * ** S t a n d a r d i m p l e m e n t a t i o n o f t h e < b > S e s s i o n < / b >
i n t e r f a c e . T h i s o b j e c t i s
* s e r i a l i z a b l e , s o t h a t i t c a n b e s t o r e d i n p e r s i s t e n t s t o r a g e o r t r a n s f e r r e d
* t o a d i f f e r e n t J V M f o r d i s t r i b u t a b l e s e s s i o n
s u p p o r t .* < p >
* < b > I M P L E M E N T A T I O N N O T E < / b > : A n i n s t a n c e o f t h i s
c l a s s r e p r e s e n t s b o t h t h e* i n t e r n a l ( S e s s i o n ) a n d a p p l i c a t i o n l e v e l
( H t t p S e s s i o n ) v i e w o f t h e s e s s i o n .
* H o w e v e r , b e c a u s e t h e c l a s s i t s e l f i s n o t d e c l a r e d p u b l i c , J a v a l o g i c o u t s i d e
* o f t h e < c o d e > o r g . a p a c h e . t o m c a t . s e s s i o n < / c o d e >
p a c k a g e c a n n o t c a s t a n* H t t p S e s s i o n v i e w o f t h i s i n s t a n c e b a c k t o a
S e s s i o n v i e w .
** @ a u t h o r C r a i g R . M c C l a n a h a n
* @ v e r s i o n $ R e v i s i o n : 1 . 2 $ $ D a t e : 2 0 0 0 / 0 5 / 1 5
1 7 : 5 4 : 1 0 $* /
f i n a l c l a s s S t a n d a r d S e s s i o ni m p l e m e n t s H t t p S e s s i o n , S e s s i o n {
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - C o n s t r u c t o r s
/ * *
* C o n s t r u c t a n e w S e s s i o n a s s o c i a t e d w i t h t h e s p e c i f i e d M a n a g e r .
*
* @ p a r a m m a n a g e r T h e m a n a g e r w i t h w h i c h t h i s S e s s i o n i s a s s o c i a t e d
* /
p u b l i c S t a n d a r d S e s s i o n ( M a n a g e r m a n a g e r ) {
s u p e r ( ) ;
t h i s . m a n a g e r = m a n a g e r ;
}
/ * *
* T h e l a s t a c c e s s e d t i m e f o r t h i s S e s s i o n .* /
p r i v a t e l o n g l a s t A c c e s s e d T i m e = c r e a t i o n T i m e ;
/ * *
* T h e M a n a g e r w i t h w h i c h t h i s S e s s i o n i s a s s o c i a t e d .
* /
p r i v a t e M a n a g e r m a n a g e r = n u l l ;
/ * ** T h e m a x i m u m t i m e i n t e r v a l , i n s e c o n d s , b e t w e e n
c l i e n t r e q u e s t s b e f o r e
* t h e s e r v l e t c o n t a i n e r m a y i n v a l i d a t e t h i s s e s s i o n . A n e g a t i v e t i m e
* i n d i c a t e s t h a t t h e s e s s i o n s h o u l d n e v e r t i m e
o u t .* /
p r i v a t e i n t m a x I n a c t i v e I n t e r v a l = - 1 ;
/ * *
* F l a g i n d i c a t i n g w h e t h e r t h i s s e s s i o n i s n e w o r n o t .
* /
p r i v a t e b o o l e a n i s N e w = t r u e ;
/ * ** F l a g i n d i c a t i n g w h e t h e r t h i s s e s s i o n i s v a l i d
o r n o t .
* /p r i v a t e b o o l e a n i s V a l i d = f a l s e ;
/ * *
* T h e s t r i n g m a n a g e r f o r t h i s p a c k a g e .
* /p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " );
/ * *
* T h e H T T P s e s s i o n c o n t e x t a s s o c i a t e d w i t h t h i s
s e s s i o n .* /
p r i v a t e s t a t i c H t t p S e s s i o n C o n t e x t s e s s i o n C o n t e x t
= n u l l ;
/ * ** T h e c u r r e n t a c c e s s e d t i m e f o r t h i s s e s s i o n .
* /
p r i v a t e l o n g t h i s A c c e s s e d T i m e = c r e a t i o n T i m e ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - S e s s i o n P r o p e r t i e s
/ * ** S e t t h e c r e a t i o n t i m e f o r t h i s s e s s i o n . T h i s
m e t h o d i s c a l l e d b y t h e
* M a n a g e r w h e n a n e x i s t i n g S e s s i o n i n s t a n c e i s r e u s e d .
*
* @ p a r a m t i m e T h e n e w c r e a t i o n t i m e* /
p u b l i c v o i d s e t C r e a t i o n T i m e ( l o n g t i m e ) {
t h i s . c r e a t i o n T i m e = t i m e ;
t h i s . l a s t A c c e s s e d T i m e = t i m e ;
t h i s . t h i s A c c e s s e d T i m e = t i m e ;
}
/ * *
* R e t u r n t h e s e s s i o n i d e n t i f i e r f o r t h i s s e s s i o n .
* /
p u b l i c S t r i n g g e t I d ( ) {
r e t u r n ( t h i s . i d ) ;
}
/ * *
* S e t t h e s e s s i o n i d e n t i f i e r f o r t h i s s e s s i o n .
** @ p a r a m i d T h e n e w s e s s i o n i d e n t i f i e r
* /
p u b l i c v o i d s e t I d ( S t r i n g i d ) {
i f ( ( t h i s . i d ! = n u l l ) & & ( m a n a g e r ! = n u l l ) & &
( m a n a g e r i n s t a n c e o f M a n a g e r B a s e ) )( ( M a n a g e r B a s e ) m a n a g e r ) . r e m o v e ( t h i s ) ;
this.id = id;
i f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e r i n s t a n c e o f
M a n a g e r B a s e ) )( ( M a n a g e r B a s e ) m a n a g e r ) . a d d ( t h i s ) ;
}
/ * ** R e t u r n d e s c r i p t i v e i n f o r m a t i o n a b o u t t h i s
S e s s i o n i m p l e m e n t a t i o n a n d
* t h e c o r r e s p o n d i n g v e r s i o n n u m b e r , i n t h e f o r m a t
*
< c o d e > & l t ; d e s c r i p t i o n & g t ; / & l t ; v e r s i o n & g t ; < / c o d e > .* /
p u b l i c S t r i n g g e t I n f o ( ) {
return (this.info);
}
/ * *
* R e t u r n t h e M a n a g e r w i t h i n w h i c h t h i s S e s s i o n is valid.
* /
p u b l i c M a n a g e r g e t M a n a g e r ( ) {
r e t u r n ( t h i s . m a n a g e r ) ;
}
/ * *
* S e t t h e M a n a g e r w i t h i n w h i c h t h i s S e s s i o n i s
v a l i d .*
* @ p a r a m m a n a g e r T h e n e w M a n a g e r
* /p u b l i c v o i d s e t M a n a g e r ( M a n a g e r m a n a g e r ) {
t h i s . m a n a g e r = m a n a g e r ;
}
/ * *
* R e t u r n t h e m a x i m u m t i m e i n t e r v a l , i n s e c o n d s , b e t w e e n c l i e n t r e q u e s t s
* b e f o r e t h e s e r v l e t c o n t a i n e r w i l l i n v a l i d a t e
t h e s e s s i o n . A n e g a t i v e* t i m e i n d i c a t e s t h a t t h e s e s s i o n s h o u l d n e v e r
time out.
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s
m e t h o d i s c a l l e d o n
* a n i n v a l i d a t e d s e s s i o n* /
p u b l i c i n t g e t M a x I n a c t i v e I n t e r v a l ( ) {
r e t u r n ( t h i s . m a x I n a c t i v e I n t e r v a l ) ;
/ * *
* P e r f o r m t h e i n t e r n a l p r o c e s s i n g r e q u i r e d t o i n v a l i d a t e
t h i s s e s s i o n ,* w i t h o u t t r i g g e r i n g a n e x c e p t i o n i f t h e s e s s i o n h a s
a l r e a d y e x p i r e d .
* /p u b l i c v o i d e x p i r e ( ) {
/ / R e m o v e t h i s s e s s i o n f r o m o u r m a n a g e r ' s a c t i v e s e s s i o n s
i f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e r i n s t a n c e o f
M a n a g e r B a s e ) )( ( M a n a g e r B a s e ) m a n a g e r ) . r e m o v e ( t h i s ) ;
/ / U n b i n d a n y o b j e c t s a s s o c i a t e d w i t h t h i s s e s s i o nV e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = g e t A t t r i b u t e N a m e s ( ) ;
w h i l e ( a t t r s . h a s M o r e E l e m e n t s ( ) ) {S t r i n g a t t r = ( S t r i n g ) a t t r s . n e x t E l e m e n t ( ) ;
r e s u l t s . a d d E l e m e n t ( a t t r ) ;
}E n u m e r a t i o n n a m e s = r e s u l t s . e l e m e n t s ( ) ;
w h i l e ( n a m e s . h a s M o r e E l e m e n t s ( ) ) {
S t r i n g n a m e = ( S t r i n g ) n a m e s . n e x t E l e m e n t ( ) ;r e m o v e A t t r i b u t e ( n a m e ) ;
}
/ / M a r k t h i s s e s s i o n a s i n v a l i d
s e t V a l i d ( f a l s e ) ;
}
/ * *
}
/ * ** S e t t h e < c o d e > i s N e w < / c o d e > f l a g f o r t h i s s e s s i o n .
*
* @ p a r a m i s N e w T h e n e w v a l u e f o r t h e < c o d e > i s N e w < / c o d e > f l a g
* /
v o i d s e t N e w ( b o o l e a n i s N e w ) {
this.isNew = isNew;
}
/ * *
* S e t t h e < c o d e > i s V a l i d < / c o d e > f l a g f o r t h i s s e s s i o n .
** @ p a r a m i s V a l i d T h e n e w v a l u e f o r t h e
< c o d e > i s V a l i d < / c o d e > f l a g
* /v o i d s e t V a l i d ( b o o l e a n i s V a l i d ) {
t h i s . i s V a l i d = i s V a l i d ;}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
H t t p S e s s i o n P r o p e r t i e s
/ * *
* R e t u r n t h e t i m e w h e n t h i s s e s s i o n w a s c r e a t e d , i n m i l l i s e c o n d s s i n c e
* m i d n i g h t , J a n u a r y 1 , 1 9 7 0 G M T .
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s
c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n* /
p u b l i c l o n g g e t C r e a t i o n T i m e ( ) {
r e t u r n ( t h i s . c r e a t i o n T i m e ) ;
}
/ * ** R e t u r n t h e s e s s i o n c o n t e x t w i t h w h i c h t h i s s e s s i o n i s
a s s o c i a t e d .
** @ d e p r e c a t e d A s o f V e r s i o n 2 . 1 , t h i s m e t h o d i s d e p r e c a t e d
a n d h a s n o
* r e p l a c e m e n t . I t w i l l b e r e m o v e d i n a f u t u r e v e r s i o n o f t h e
* J a v a S e r v l e t A P I .
* /p u b l i c H t t p S e s s i o n C o n t e x t g e t S e s s i o n C o n t e x t ( ) {
i f ( s e s s i o n C o n t e x t = = n u l l )s e s s i o n C o n t e x t = n e w S t a n d a r d S e s s i o n C o n t e x t ( ) ;
r e t u r n ( s e s s i o n C o n t e x t ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
H t t p S e s s i o n P u b l i c M e t h o d s
/ * *
* R e t u r n t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e i n t h i s s e s s i o n , o r
* < c o d e > n u l l < / c o d e > i f n o o b j e c t i s b o u n d w i t h t h a t n a m e .
** @ p a r a m n a m e N a m e o f t h e a t t r i b u t e t o b e r e t u r n e d
*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
* /p u b l i c O b j e c t g e t A t t r i b u t e ( S t r i n g n a m e ) {
r e t u r n ( a t t r i b u t e s . g e t ( n a m e ) ) ;
}
/ * *
* R e t u r n a n < c o d e > E n u m e r a t i o n < / c o d e > o f < c o d e > S t r i n g < / c o d e > o b j e c t s
* c o n t a i n i n g t h e n a m e s o f t h e o b j e c t s b o u n d t o t h i s
s e s s i o n .*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s
c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
* /
p u b l i c E n u m e r a t i o n g e t A t t r i b u t e N a m e s ( ) {
r e t u r n ( a t t r i b u t e s . k e y s ( ) ) ;
}
/ * *
* R e t u r n t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e i n t h i s
s e s s i o n , o r* < c o d e > n u l l < / c o d e > i f n o o b j e c t i s b o u n d w i t h t h a t n a m e .
*
* @ p a r a m n a m e N a m e o f t h e v a l u e t o b e r e t u r n e d*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s
c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d i s r e p l a c e d b y
* < c o d e > g e t A t t r i b u t e ( ) < / c o d e >
* /p u b l i c O b j e c t g e t V a l u e ( S t r i n g n a m e ) {
r e t u r n ( g e t A t t r i b u t e ( n a m e ) ) ;
}
/ * *
* R e t u r n t h e s e t o f n a m e s o f o b j e c t s b o u n d t o t h i s s e s s i o n . I f t h e r e
* a r e n o s u c h o b j e c t s , a z e r o - l e n g t h a r r a y i s r e t u r n e d .
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s
c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d i s r e p l a c e d
b y* < c o d e > g e t A t t r i b u t e N a m e s ( ) < / c o d e >
* /
p u b l i c S t r i n g [ ] g e t V a l u e N a m e s ( ) {
V e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = g e t A t t r i b u t e N a m e s ( ) ;w h i l e ( a t t r s . h a s M o r e E l e m e n t s ( ) ) {
S t r i n g a t t r = ( S t r i n g ) a t t r s . n e x t E l e m e n t ( ) ;
r e s u l t s . a d d E l e m e n t ( a t t r ) ;}
S t r i n g n a m e s [ ] = n e w S t r i n g [ r e s u l t s . s i z e ( ) ] ;
f o r ( i n t i = 0 ; i < n a m e s . l e n g t h ; i + + )n a m e s [ i ] = ( S t r i n g ) r e s u l t s . e l e m e n t A t ( i ) ;
r e t u r n ( n a m e s ) ;
}
/ * *
* I n v a l i d a t e s t h i s s e s s i o n a n d u n b i n d s a n y o b j e c t s b o u n d
t o i t .*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s
called on* a n i n v a l i d a t e d s e s s i o n
* /
p u b l i c v o i d i n v a l i d a t e ( ) {
// Cause this session to expire
e x p i r e ( ) ;
}
/ * *
* R e t u r n < c o d e > t r u e < / c o d e > i f t h e c l i e n t d o e s n o t y e t k n o w about the
* s e s s i o n , o r i f t h e c l i e n t c h o o s e s n o t t o j o i n t h e
s e s s i o n . F o r* e x a m p l e , i f t h e s e r v e r u s e d o n l y c o o k i e - b a s e d s e s s i o n s ,
a n d t h e c l i e n t
* h a s d i s a b l e d t h e u s e o f c o o k i e s , t h e n a s e s s i o n w o u l d b e n e w o n e a c h
* request.
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s
c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n* /
p u b l i c b o o l e a n i s N e w ( ) {
r e t u r n ( t h i s . i s N e w ) ;
}
* R e m o v e t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e f r o m t h i s s e s s i o n . I f* t h e s e s s i o n d o e s n o t h a v e a n o b j e c t b o u n d w i t h t h i s n a m e , t h i s m e t h o d
* d o e s n o t h i n g .
* <p>* After this method executes, and if the object implements
* < c o d e > H t t p S e s s i o n B i n d i n g L i s t e n e r < / c o d e > , t h e c o n t a i n e r c a l l s
* < c o d e > v a l u e U n b o u n d ( ) < / c o d e > o n t h e o b j e c t .*
* @ p a r a m n a m e N a m e o f t h e o b j e c t t o r e m o v e f r o m t h i s s e s s i o n .
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
* /p u b l i c v o i d r e m o v e A t t r i b u t e ( S t r i n g n a m e ) {
s y n c h r o n i z e d ( a t t r i b u t e s ) {O b j e c t o b j e c t = a t t r i b u t e s . g e t ( n a m e ) ;
i f ( o b j e c t = = n u l l )
r e t u r n ;a t t r i b u t e s . r e m o v e ( n a m e ) ;
/ / S y s t e m . o u t . p r i n t l n ( " R e m o v i n g a t t r i b u t e " + n a m e ) ;
i f ( o b j e c t i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r ) {( ( H t t p S e s s i o n B i n d i n g L i s t e n e r ) o b j e c t ) . v a l u e U n b o u n d
( n e w H t t p S e s s i o n B i n d i n g E v e n t ( ( H t t p S e s s i o n ) t h i s , n a m e ) ) ;
}}
}
* B i n d a n o b j e c t t o t h i s s e s s i o n , u s i n g t h e s p e c i f i e d n a m e . I f a n o b j e c t
* o f t h e s a m e n a m e i s a l r e a d y b o u n d t o t h i s s e s s i o n , t h e o b j e c t i s* r e p l a c e d .
* <p>
* After this method executes, and if the object implements* < c o d e > H t t p S e s s i o n B i n d i n g L i s t e n e r < / c o d e > , t h e c o n t a i n e r c a l l s
* < c o d e > v a l u e B o u n d ( ) < / c o d e > o n t h e o b j e c t .
** @ p a r a m n a m e N a m e t o w h i c h t h e o b j e c t i s b o u n d , c a n n o t b e n u l l
* @ p a r a m v a l u e O b j e c t t o b e b o u n d , c a n n o t b e n u l l
** @ e x c e p t i o n I l l e g a l A r g u m e n t E x c e p t i o n i f a n a t t e m p t i s m a d e t o a d d a
* n o n - s e r i a l i z a b l e o b j e c t i n a n e n v i r o n m e n t m a r k e d d i s t r i b u t a b l e .
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
* /
p u b l i c v o i d s e t A t t r i b u t e ( S t r i n g n a m e , O b j e c t v a l u e ) {
i f ( ( m a n a g e r ! = n u l l ) & & m a n a g e r . g e t D i s t r i b u t a b l e ( ) & &
! ( v a l u e i n s t a n c e o f S e r i a l i z a b l e ) )t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d S e s s i o n . s e t A t t r i b u t e . i a e " ) ) ;
s y n c h r o n i z e d ( a t t r i b u t e s ) {
r e m o v e A t t r i b u t e ( n a m e ) ;
a t t r i b u t e s . p u t ( n a m e , v a l u e ) ;i f ( v a l u e i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r )
( ( H t t p S e s s i o n B i n d i n g L i s t e n e r ) v a l u e ) . v a l u e B o u n d
( n e w H t t p S e s s i o n B i n d i n g E v e n t ( ( H t t p S e s s i o n ) t h i s , n a m e ) ) ;}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - H t t p S e s s i o n P r i v a t e M e t h o d s
/ * ** R e a d a s e r i a l i z e d v e r s i o n o f t h i s s e s s i o n o b j e c t f r o m t h e s p e c i f i e d
* o b j e c t i n p u t s t r e a m .
* <p>* < b > I M P L E M E N T A T I O N N O T E < / b > : T h e r e f e r e n c e t o t h e o w n i n g M a n a g e r
* i s n o t r e s t o r e d b y t h i s m e t h o d , a n d m u s t b e s e t e x p l i c i t l y .
** @ p a r a m s t r e a m T h e i n p u t s t r e a m t o r e a d f r o m
*
* @ e x c e p t i o n C l a s s N o t F o u n d E x c e p t i o n i f a n u n k n o w n c l a s s i s s p e c i f i e d* @ e x c e p t i o n I O E x c e p t i o n i f a n i n p u t / o u t p u t e r r o r o c c u r s
* /
p r i v a t e v o i d r e a d O b j e c t ( O b j e c t I n p u t S t r e a m s t r e a m )t h r o w s C l a s s N o t F o u n d E x c e p t i o n , I O E x c e p t i o n {
/ / D e s e r i a l i z e t h e s c a l a r i n s t a n c e v a r i a b l e s ( e x c e p t M a n ager)c r e a t i o n T i m e = ( ( L o n g ) s t r e a m . r e a d O b j e c t ( ) ) .
i s V a l i d = ( ( B o o l e a n ) s t r e a m . r e a d O b j e c t ( ) ) . b o o l e a n V a l u e ( ) ;
/ / D e s e r i a l i z e t h e a t t r i b u t e c o u n t a n d a t t r i b u t e v a l u e s
i n t n = ( ( I n t e g e r ) s t r e a m . r e a d O b j e c t ( ) ) . i n t V a l u e ( ) ;
f o r ( i n t i = 0 ; i < n ; i + + ) {S t r i n g n a m e = ( S t r i n g ) s t r e a m . r e a d O b j e c t ( ) ;
O b j e c t v a l u e = ( O b j e c t ) s t r e a m . r e a d O b j e c t ( ) ;
a t t r i b u t e s . p u t ( n a m e , v a l u e ) ;}
}
/ * ** W r i t e a s e r i a l i z e d v e r s i o n o f t h i s s e s s i o n o b j e c t t o t h e s p e c i f i e d
* o b j e c t o u t p u t s t r e a m .
* <p>* < b > I M P L E M E N T A T I O N N O T E < / b > : T h e o w n i n g M a n a g e r w i l l n o t b e s t o r e d
* i n t h e s e r i a l i z e d r e p r e s e n t a t i o n o f t h i s S e s s i o n . A f t e r c a l l i n g
* < c o d e > r e a d O b j e c t ( ) < / c o d e > , y o u m u s t s e t t h e a s s o c i a t e d M a nager* e x p l i c i t l y .
* <p>
* < b > I M P L E M E N T A T I O N N O T E < / b > : A n y a t t r i b u t e t h a t i s n o t S e r i a l i z a b l e* w i l l b e s i l e n t l y i g n o r e d . I f y o u d o n o t w a n t a n y s u c h a t t r i b u t e s ,
* b e s u r e t h e < c o d e > d i s t r i b u t a b l e < / c o d e > p r o p e r t y o f o u r a s s o c i a t e d
* M a n a g e r i s s e t t o < c o d e > t r u e < / c o d e > .*
* @ p a r a m s t r e a m T h e o u t p u t s t r e a m t o w r i t e t o
** @ e x c e p t i o n I O E x c e p t i o n i f a n i n p u t / o u t p u t e r r o r o c c u r s
* /
p r i v a t e v o i d w r i t e O b j e c t ( O b j e c t O u t p u t S t r e a m s t r e a m ) t h r o w s I O E x c e p t i o n {
/ / W r i t e t h e s c a l a r i n s t a n c e v a r i a b l e s ( e x c e p t M a n a g e r )
s t r e a m . w r i t e O b j e c t ( n e w L o n g ( c r e a t i o n T i m e ) ) ;s t r e a m . w r i t e O b j e c t ( i d ) ;
s t r e a m . w r i t e O b j e c t ( n e w L o n g ( l a s t A c c e s s e d T i m e ) ) ;
s t r e a m . w r i t e O b j e c t ( n e w I n t e g e r ( m a x I n a c t i v e I n t e r v a l ) ) ;s t r e a m . w r i t e O b j e c t ( n e w B o o l e a n ( i s N e w ) ) ;
s t r e a m . w r i t e O b j e c t ( n e w B o o l e a n ( i s V a l i d ) ) ;
/ / A c c u m u l a t e t h e n a m e s o f s e r i a l i z a b l e a t t r i b u t e s
V e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = g e t A t t r i b u t e N a m e s ( ) ;w h i l e ( a t t r s . h a s M o r e E l e m e n t s ( ) ) {
S t r i n g a t t r = ( S t r i n g ) a t t r s . n e x t E l e m e n t ( ) ;
O b j e c t v a l u e = a t t r i b u t e s . g e t ( a t t r ) ;i f ( v a l u e i n s t a n c e o f S e r i a l i z a b l e )
r e s u l t s . a d d E l e m e n t ( a t t r ) ;
}
/ / S e r i a l i z e t h e a t t r i b u t e c o u n t a n d t h e a t t r i b u t e v a l u e s
s t r e a m . w r i t e O b j e c t ( n e w I n t e g e r ( r e s u l t s . s i z e ( ) ) ) ;E n u m e r a t i o n n a m e s = r e s u l t s . e l e m e n t s ( ) ;
w h i l e ( n a m e s . h a s M o r e E l e m e n t s ( ) ) {
S t r i n g n a m e = ( S t r i n g ) n a m e s . n e x t E l e m e n t ( ) ;s t r e a m . w r i t e O b j e c t ( n a m e ) ;
s t r e a m . w r i t e O b j e c t ( a t t r i b u t e s . g e t ( n a m e ) ) ;
}
}
c r o s s c u t i n v a l i d a t e ( S t a n d a r d S e s s i o n s ) : s & ( i n t g e t M a x I n a c t i v e I n t e r v a l ( ) |
l o n g g e t C r e a t i o n T i m e ( ) |O b j e c t g e t A t t r i b u t e ( S t r i n g ) |
E n u m e r a t i o n g e t A t t r i b u t e N a m e s ( ) |
S t r i n g [ ] g e t V a l u e N a m e s ( ) |v o i d i n v a l i d a t e ( ) |
b o o l e a n i s N e w ( ) |
v o i d r e m o v e A t t r i b u t e ( S t r i n g ) |v o i d s e t A t t r i b u t e ( S t r i n g , O b j e c t ) ) ;
s t a t i c a d v i c e ( S t a n d a r d S e s s i o n s ) : i n v a l i d a t e ( s ) {b e f o r e {
i f ( ! s . i s V a l i d ( ) )
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n( s . s m . g e t S t r i n g ( " s t a n d a r d S e s s i o n . "
+ t h i s J o i n P o i n t . m e t h o d N a m e
+ " . i s e " ) ) ;}
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P r i v a t e C l a s s
/ * *
* T h i s c l a s s i s a d u m m y i m p l e m e n t a t i o n o f t h e < c o d e > H t t p S e s s i o n C o n t e x t < / c o d e >
* i n t e r f a c e , t o c o n f o r m t o t h e r e q u i r e m e n t t h a t s u c h a n o b j e c t be returned* w h e n < c o d e > H t t p S e s s i o n . g e t S e s s i o n C o n t e x t ( ) < / c o d e > i s c a l l e d .
*
* @ a u t h o r C r a i g R . M c C l a n a h a n*
* @ d e p r e c a t e d A s o f J a v a S e r v l e t A P I 2 . 1 w i t h n o r e p l a c e m e n t . T h e
* i n t e r f a c e w i l l b e r e m o v e d i n a f u t u r e v e r s i o n o f t h i s A P I .* /
f i n a l c l a s s S t a n d a r d S e s s i o n C o n t e x t i m p l e m e n t s H t t p S e s s i o n C o n t e x t {
p r i v a t e V e c t o r d u m m y = n e w V e c t o r ( ) ;
/ * *
* R e t u r n t h e s e s s i o n i d e n t i f i e r s o f a l l s e s s i o n s d e f i n e d* w i t h i n t h i s c o n t e x t .
*
* @ d e p r e c a t e d A s o f J a v a S e r v l e t A P I 2 . 1 w i t h n o r e p l a c e m e n t .* T h i s m e t h o d m u s t r e t u r n a n e m p t y < c o d e > E n u m e r a t i o n < / c o d e >
* a n d w i l l b e r e m o v e d i n a f u t u r e v e r s i o n o f t h e A P I .
* /p u b l i c E n u m e r a t i o n g e t I d s ( ) {
r e t u r n ( d u m m y . e l e m e n t s ( ) ) ;
}
/ * *
* R e t u r n t h e < c o d e > H t t p S e s s i o n < / c o d e > a s s o c i a t e d w i t h t h e* s p e c i f i e d s e s s i o n i d e n t i f i e r .
*
* @ p a r a m i d S e s s i o n i d e n t i f i e r f o r w h i c h t o l o o k u p a s e s s i o n*
* @ d e p r e c a t e d A s o f J a v a S e r v l e t A P I 2 . 1 w i t h n o r e p l a c e m e n t .
* T h i s m e t h o d m u s t r e t u r n n u l l a n d w i l l b e r e m o v e d i n a* f u t u r e v e r s i o n o f t h e A P I .
* /
p u b l i c H t t p S e s s i o n g e t S e s s i o n ( S t r i n g i d ) {
r e t u r n ( n u l l ) ;
}
}
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
19
1. Identificando los aspectos modulares
Problemas derivados de la mezcla de incumbencias: ¿ Cómo conseguirlo?
Introducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
SessionInterceptor
requestMap(request)beforeBody(req, resp)...
Session
getAttribute(name)setAttribute(name, val)invalidate()...
getCookies()getRequestURI()(doc)getSession()getRequestedSessionId()...
HTTPRequest
HTTPResponse
Servlet
getRequest()setContentType(contentType)getOutptutStream()setSessionId(id)...
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
20
2. Con soporte del lenguaje y herramientas para ....
Problemas derivados de la mezcla de incumbencias: ¿ Cómo conseguirlo?
Introducción
Tabla de contenidos • Introducción–El problema de la metodología tradicional– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– Consecuencias de la mezcla de incumbencias• Idea de POA • LPOA• El lenguaje AspectJ• Ejemplos• Taller
• Soporte del lenguaje para/ *
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
** T h e A p a c h e S o f t w a r e L i c e n s e , V e r s i o n 1 . 1
*
* C o p y r i g h t ( c ) 1 9 9 9 T h e A p a c h e S o f t w a r e F o u n d a t i o n . A l l r i g h t s* r e s e r v e d .
*
* R e d i s t r i b u t i o n a n d u s e i n s o u r c e a n d b i n a r y f o r m s , w i t h o r w i thout* m o d i f i c a t i o n , a r e p e r m i t t e d p r o v i d e d t h a t t h e f o l l o w i n g c o n d i tions
* a r e m e t :
** 1 . R e d i s t r i b u t i o n s o f s o u r c e c o d e m u s t r e t a i n t h e a b o v e c o p y r i g h t
* n o t i c e , t h i s l i s t o f c o n d i t i o n s a n d t h e f o l l o w i n g d i s c l a i m e r .
** 2 . R e d i s t r i b u t i o n s i n b i n a r y f o r m m u s t r e p r o d u c e t h e a b o v e c o p y r i g h t
* n o t i c e , t h i s l i s t o f c o n d i t i o n s a n d t h e f o l l o w i n g d i s c l a i m er in
* t h e d o c u m e n t a t i o n a n d / o r o t h e r m a t e r i a l s p r o v i d e d w i t h t h e* d i s t r i b u t i o n .
*
* 3 . T h e e n d -u s e r d o c u m e n t a t i o n i n c l u d e d w i t h t h e r e d i s t r i b u t i o n , i f* a n y , m u s t i n c l u d e t h e f o l l o w i n g a c k n o w l e g e m e n t :
* " T h i s p r o d u c t i n c l u d e s s o f t w a r e d e v e l o p e d b y t h e
* A p a c h e S o f t w a r e F o u n d a t i o n ( h t t p : / / w w w . a p a c h e . o r g / ) . "* A l t e r n a t e l y , t h i s a c k n o w l e g e m e n t m a y a p p e a r i n t h e s o f t w a r e
i t s e l f ,
* i f a n d w h e r e v e r s u c h t h i r d- p a r t y a c k n o w l e g e m e n t s n o r m a l l y a p p e a r .*
* 4 . T h e n a m e s " T h e J a k a r t a P r o j e c t " , " T o m c a t " , a n d " A p a c h e S o f tware
* F o u n d a t i o n " m u s t n o t b e u s e d t o e n d o r s e o r p r o m o t e p r o d u c t sd e r i v e d
* f r o m t h i s s o f t w a r e w i t h o u t p r i o r w r i t t e n p e r m i s s i o n . F o r w r i t t e n
* p e r m i s s i o n , p l e a s e c o n t a c t a p a c h e @ a p a c h e . o r g .*
* 5 . P r o d u c t s d e r i v e d f r o m t h i s s o f t w a r e m a y n o t b e c a l l e d " A p a c h e "
* n o r m a y " A p a c h e " a p p e a r i n t h e i r n a m e s w i t h o u t p r i o r w r i t t e n* p e r m i s s i o n o f t h e A p a c h e G r o u p .
*
* T H I S S O F T W A R E I S P R O V I D E D ` ` A S I S ' ' A N D A N Y E X P R E S S E D O R I M P L I E D* W A R R A N T I E S , I N C L U D I N G , B U T N O T L I M I T E D T O , T H E I M P L I E D W A R R A N T I E S
* O F M E R C H A N T A B I L I T Y A N D F I T N E S S F O R A P A R T I C U L A R P U R P O S E A R E
* D I S C L A I M E D . I N N O E V E N T S H A L L T H E A P A C H E S O F T W A R E F O U N D A T I O N O R* I T S C O N T R I B U T O R S B E L I A B L E F O R A N Y D I R E C T , I N D I R E C T , I N C I D E N T A L ,
* S P E C I A L , E X E M P L A R Y , O R C O N S E Q U E N T I A L D A M A G E S ( I N C L U D I N G , B U T N O T
* L I M I T E D T O , P R O C U R E M E N T O F S U B S T I T U T E G O O D S O R S E R V I C E S ; L O S S O F* U S E , D A T A , O R P R O F I T S ; O R B U S I N E S S I N T E R R U P T I O N ) H O W E V E R C A U S E D A N D
* O N A N Y T H E O R Y O F L I A B I L I T Y , W H E T H E R I N C O N T R A C T , S T R I C T L I A B I LITY,
* O R T O R T ( I N C L U D I N G N E G L I G E N C E O R O T H E R W I S E ) A R I S I N G I N A N Y W A Y OUT* O F T H E U S E O F T H I S S O F T W A R E , E V E N I F A D V I S E D O F T H E P O S S I B I L I TY OF
* S U C H D A M A G E .
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*
* T h i s s o f t w a r e c o n s i s t s o f v o l u n t a r y c o n t r i b u t i o n s m a d e b y m a n y
* i n d i v i d u a l s o n b e h a l f o f t h e A p a c h e S o f t w a r e F o u n d a t i o n . F o r more* i n f o r m a t i o n o n t h e A p a c h e S o f t w a r e F o u n d a t i o n , p l e a s e s e e
* < h t t p : / / w w w . a p a c h e . o r g / > .
** [ A d d i t i o n a l n o t i c e s , i f r e q u i r e d b y p r i o r l i c e n s i n g c o n d i t i o n s ]
*
* /
p a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;
i m p o r t j a v a . i o. * ;
i m p o r t j a v a . n e t . * ;i m p o r t j a v a . u t i l . * ;
i m p o r t j a v a x . s e r v l e t. * ;
i m p o r t j a v a x . s e r v l e t. h t t p . * ;
/ * *
* C o r e i m p l e m e n t a t i o n o f a n a p p l i c a t i o n l e v e l s e s s i o n*
* @ a u t h o r J a m e s D u n c a n D a v i d s o n [ d u n c a n @ e n g . s u n . c o m ]
* @ a u t h o r J a s o n H u n t e r [ jch@ e n g . s u n . c o m ]* @ a u t h o r J a m e s T o d d [ g o n z o @ e n g . s u n . c o m ]
* /
p u b l i c c l a s s A p p l i c a t i o n S e s s i o n i m p l e m e n t s H t t p S e s s i o n {
p r i v a t e S t r i n g M a n a g e r s m =StringManager . g e t M a n a g e r( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;
p r i v a t e Hashtable v a l u e s = n e w H a s h t a b l e( ) ;
p r i v a t e S t r i n g i d ;p r i v a t e S e r v e r S e s s i o n s e r v e r S e s s i o n ;
p r i v a t e C o n t e x t c o n t e x t ;
p r i v a t e l o n g c r e a t i o n T i m e = System. c u r r e n t T i m e M i l l i s( ) ; ;p r i v a t e l o n g t h i s A c c e s s T i m e = c r e a t i o n T i m e ;
p r i v a t e l o n g l a s t A c c e s s e d = c r e a t i o n T i m e;
p r i v a t e i n t i n a c t i v e I n t e r v a l = - 1 ;p r i v a t e b o o l e a n v a l i d = t r u e ;
A p p l i c a t i o n S e s s i o n (String id, S e r v e r S e s s i o n s e r v e r S e s s i o n ,C o n t e x t c o n t e x t ) {
t h i s . s e r v e r S e s s i o n = s e r v e r S e s s i o n ;
t h i s . c o n t e x t = c o n t e x t ;this.id = id;
t h i s . i n a c t i v e I n t e r v a l = c o n t e x t . getSessionTimeOut ( ) ;
i f ( t h i s . inactiveInterval ! = -1 ) {
t h i s . inactiveInterval * = 6 0 ;}
}
S e r v e r S e s s i o n g e t S e r v e r S e s s i o n ( ) {
r e t u r n s e r v e r S e s s i o n ;
}
/ * *
* C a l l e d b y c o n t e x t w h e n r e q u e s t c o m e s i n s o t h a t a c c e s s e s a n d* i n a c t i v i t i e s c a n b e d e a l t w i t h a c c o r d i n g l y .
* /
v o i d a c c e s s e d ( ) {
/ / s e t l a s t a c c e s s e d t o t h i s A c c e s s T i m e a s i t w i l l b e l e f t o v e r
/ / f r o m t h e p r e v i o u s a c c e s sl a s t A c c e s s e d = t h i s A c c e s s T i m e ;
t h i s A c c e s s T i m e = S y s t e m .c u r r e n t T i m e M i l l i s ();
v a l i d a t e ( ) ;
}
v o i d v a l i d a t e ( ) {
/ / i f w e h a v e a n i n a c t i v e i n t e r v a l , c h e c k t o s e e i f w e ' v e e x c e e d e d i t
i f ( i n a c t i v e I n t e r v a l ! = - 1 ) {i n t t h i s I n t e r v a l =
( i n t) ( S y s t e m . c u r r e n t T i m e M i l l i s ( ) - lastAccessed ) / 1 0 0 0 ;
if (t h i s I n t e r v a l > i n a c t i v e I n t e r v a l ) {
i n v a l i d a t e ( ) ;
}}
}
/ / H T T P S E S S I O N I M P L E M E N T A T I O N M E T H O D S
p u b l i c S t r i n g g e t I d () {i f ( v a l i d ) {
return id;
} e l s e {S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;}
}
public long g e t C r e a t i o n T i m e () {
i f ( v a l i d ) {
r e t u r n c r e a t i o n T i m e ;} e l s e {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}
}
/ * *
** @ d e p r e c a t e d
* /
p u b l i c H t t p S e s s i o n C o n t e x t g e t S e s s i o n C o n t e x t () {
r e t u r n n e w S e s s i o n C o n t e x t I m p l ();
}
public long g e t L a s t A c c e s s e d T i m e () {
i f ( v a l i d ) {r e t u r n l a s t A c c e s s e d ;
} e l s e {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}}
p u b l i c v o i d i n v a l i d a t e ( ) {
s e r v e r S e s s i o n . r e m o v e A p p l i c a t i o n S e s s i o n ( c o n t e x t ) ;
/ / r e m o v e e v e r y t h i n g i n t h e s e s s i o n
E n u m e r a t i o n e n u m = v a l u e s . k e y s ( ) ;w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {
S t r i n g n a m e = ( S t r i n g ) e n u m . n e x t E l e m e n t ( ) ;
r e m o v e V a l u e ( n a m e ) ;}
v a l i d = f a l s e ;}
p u b l i c b o o l e a n i s N e w ( ) {i f ( ! v a l i d ) {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;
}
i f ( t h i s A c c e s s T i m e = = c r e a t i o n T i m e ) {
r e t u r n t r u e ;
} e l s e {r e t u r n f a l s e ;
}
}
/ * ** @ d e p r e c a t e d
* /
public void p u t V a l u e ( S t r i n g n a m e , O b j e c t v a l u e ) {
s e t A t t r i b u t e( n a m e , v a l u e ) ;
}
public void s e t A t t r i b u t e ( S t r i n g n a m e , O b j e c t v a l u e ) {
i f ( ! v a l i d ) {S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;}
i f ( n a m e = = n u l l ) {S t r i n g msg = sm.g e t S t r i n g (" applicationSession . v a l u e . i a e ");
throw new I l l e g a l A r g u m e n t E x c e p t i o n ( m s g) ;}
r e m o v e V a l u e ( n a m e ) ; / / r e m o v e a n y e x i s t i n g b i n d i n g
i f ( v a l u e ! = n u l l & & v a l u e i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r ) {
H t t p S e s s i o n B i n d i n g E v e n t e =n e w H t t p S e s s i o n B i n d i n g E v e n t ( t h i s , n a m e ) ;
( (H t t p S e s s i o n B i n d i n g L i s t e n e r ) v a l u e ) . v a l u e B o u n d ( e ) ;}
v a l u e s . p u t ( n a m e , v a l u e ) ;}
/ * ** @ d e p r e c a t e d
* /
p u b l i c O b j e c t g e t V a l u e( S t r i n g n a m e ) {r e t u r n getAttribute ( n a m e ) ;
}
p u b l i c O b j e c t g e t A t t r i b u t e ( S t r i n g n a m e ) {
i f ( ! v a l i d ) {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}
i f ( n a m e = = n u l l ) {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . v a l u e . i a e ");
throw new I l l e g a l A r g u m e n t E x c e p t i o n ( m s g) ;
}
r e t u r n v a l u e s . g e t ( n a m e ) ;
}
/ * *
* @ d e p r e c a t e d* /
p u b l i c S t r i n g [ ] getValueNames ( ) {
E n u m e r a t i o n e = g e t A t t r i b u t e N a m e s ( ) ;V e c t o r n a m e s = n e w V e c t o r ( ) ;
w h i l e ( e . h a s M o r e E l e m e n t s( ) ) {n a m e s . a d d E l e m e n t ( e . n e x t E l e m e n t ());
}
S t r i n g [ ] valueNames = n e w S t r i n g [ n a m e s . s i z e ( ) ] ;
n a m e s .c o p y I n t o ( valueNames ) ;
r e t u r n v a l u e N a m e s ;
}
p u b l i c E n u m e r a t i o n g e t A t t r i b u t e N a m e s ( ) {i f ( ! v a l i d ) {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}
H a s h t a b l e v a l u e s C l o n e = ( H a s h t a b l e ) v a l u e s . c l o n e ( ) ;
r e t u r n ( E n u m e r a t i o n ) valuesClone . k e y s ( ) ;}
/ * *
* @ d e p r e c a t e d
* /
public void removeValue ( S t r i n g n a m e ) {
r e m o v e A t t r i b u t e ( n a m e ) ;}
public void r e m o v e A t t r i b u t e (String name) {i f ( ! v a l i d ) {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}
i f ( n a m e = = n u l l ) {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . v a l u e . i a e ");
throw new I l l e g a l A r g u m e n t E x c e p t i o n ( m s g) ;
}
O b j e c t o = v a l u e s . g e t ( n a m e ) ;
i f ( o i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r ) {H t t p S e s s i o n B i n d i n g E v e n t e =
n e w H t t p S e s s i o n B i n d i n g E v e n t ( t h i s , n a m e ) ;
( (H t t p S e s s i o n B i n d i n g L i s t e n e r ) o ) .v a l u e U n b o u n d( e ) ;
}
v a l u e s . r e m o v e ( n a m e ) ;
}
public void s e t M a x I n a c t i v e I n t e r v a l( i n t i n t e r v a l ) {
i f ( ! v a l i d ) {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}
i n a c t i v e I n t e r v a l = i n t e r v a l ;
}
p u b l i c i n t g e t M a x I n a c t i v e I n t e r v a l () {
i f ( ! v a l i d ) {S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;}
r e t u r n i n a c t i v e I n t e r v a l ;}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ApplicationSession p a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t j a v a . i o . I O E x c e p t i o n ;
i m p o r t j a v a . i o . O b j e c t I n p u t S t r e a m ;
i m p o r t j a v a . i o . O b j e c t O u t p u t S t r e a m ;i m p o r t j a v a . i o . S e r i a l i z a b l e ;
i m p o r t j a v a . u t i l . E n u m e r a t i o n ;
i m p o r t j a v a . u t i l . H a s h t a b l e ;i m p o r t j a v a . u t i l . V e c t o r ;
i m p o r t j a v a x . s e r v l e t . S e r v l e t E x c e p t i o n ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n ;i m p o r t
j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n B i n d i n g E v e n t
;i m p o r t
j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n B i n d i n g L i s t e
n e r ;i m p o r t
j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n C o n t e x t ;
i m p o r t o r g . a p a c h e . t o m c a t . c a t a l i n a . * ;i m p o r t
o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;
/ * *
* S t a n d a r d i m p l e m e n t a t i o n o f t h e < b > S e s s i o n < / b > i n t e r f a c e . T h i s o b j e c t i s
* serializable , s o t h a t i t c a n b e s t o r e d
i n p e r s i s t e n t s t o r a g e o r t r a n s f e r r e d* t o a d i f f e r e n t J V M f o r d i s t r i b u t a b l e
s e s s i o n s u p p o r t .
* < p >* < b > I M P L E M E N T A T I O N N O T E < / b > : A n
i n s t a n c e o f t h i s c l a s s r e p r e s e n t s b o t h t h e
* i n t e r n a l ( S e s s i o n ) a n d a p p l i c a t i o n l e v e l ( H t t p S e s s i o n ) v i e w o f t h e s e s s i o n .
* H o w e v e r , b e c a u s e t h e c l a s s i t s e l f i s
n o t d e c l a r e d p u b l i c , J a v a l o g i c o u t s i d e* o f t h e
< c o d e > o r g . a p a c h e . t o m c a t . s e s s i o n < / c o d e >
p a c k a g e c a n n o t c a s t a n* H t t p S e s s i o n v i e w o f t h i s i n s t a n c e b a c k
t o a S e s s i o n v i e w .
** @ a u t h o r C r a i g R . M c C l a n a h a n
* @ v e r s i o n $ R e v i s i o n : 1 . 2 $ $ D a t e :
2 0 0 0 / 0 5 / 1 5 1 7 : 5 4 : 1 0 $* /
f i n a l c l a s s StandardSessioni m p l e m e n t s H t t p S e s s i o n, S e s s i o n {
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - C o n s t r u c t o r s
/ * *
* C o n s t r u c t a n e w S e s s i o n a s s o c i a t e d w i t h t h e s p e c i f i e d M a n a g e r .
*
* @p a r a m m a n a g e r T h e m a n a g e r w i t h w h i c h t h i s S e s s i o n i s a s s o c i a t e d
* /
p u b l i c S t a n d a r d S e s s i o n( M a n a g e r m a n a g e r ) {
s u p e r ( ) ;t h i s . m a n a g e r = m a n a g e r ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - I n s t a n c e V a r i a b l e s
/ * *
* T h e c o l l e c t i o n o f u s e r d a t a
a t t r i b u t e s a s s o c i a t e d w i t h t h i s S e s s i o n .* /
p r i v a t e Hashtable a t t r i b u t e s = n e w
Hashtable ( ) ;
/ * ** T h e t i m e t h i s s e s s i o n w a s c r e a t e d ,
i n m i l l i s e c o n d s s i n c e m i d n i g h t ,
* January 1, 1970 GMT.* /
p r i v a t e l o n g c r e a t i o n T i m e = 0 L ;
/ * *
* T h e s e s s i o n i d e n t i f i e r o f t h i s S e s s i o n .
* /
p r i v a t e S t r i n g i d = n u l l ;
/ * ** D e s c r i p t i v e i n f o r m a t i o n d e s c r i b i n g
t h i s S e s s i o n i m p l e m e n t a t i o n .
* /p r i v a t e s t a t i c f i n a l S t r i n g i n f o =
" S t a n d a r d S e s s i o n / 1 . 0 " ;
/ * *
* The last accessed time for this S e s s i o n .
* /
p r i v a t e l o n g lastAccessedTime =c r e a t i o n T i m e ;
/ * *
* T h e M a n a g e r w i t h w h i c h t h i s S e s s i o n
i s a s s o c i a t e d .* /
p r i v a t e M a n a g e r m a n a g e r = n u l l ;
/ * *
* T h e m a x i m u m t i m e i n t e r v a l , i n s e c o n d s , b e t w e e n c l i e n t r e q u e s t s b e f o r e
* the s e r v l e t container may
i n v a l i d a t e t h i s s e s s i o n . A n e g a t i v e t i m e* i n d i c a t e s t h a t t h e s e s s i o n s h o u l d
never time out.
* /p r i v a t e i n t m a x I n a c t i v e I n t e r v a l = - 1 ;
/ * *
* F l a g i n d i c a t i n g w h e t h e r t h i s
s e s s i o n i s n e w o r n o t .* /
p r i v a t e b o o l e a n i s N e w = true;
/ * *
* F l a g i n d i c a t i n g w h e t h e r t h i s s e s s i o n i s v a l i d o r n o t .
* /
p r i v a t e b o o l e a n i s V a l i d = f a l s e ;
/ * ** T h e s t r i n g m a n a g e r f o r t h i s
p a c k a g e .
* /p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r .g e t M a n a g e r ( " o r g . a p a c h e . t o m c at . s e s s i o n " ) ;
/ * *
* T h e H T T P s e s s i o n c o n t e x t a s s o c i a t e d
w i t h t h i s s e s s i o n .* /
p r i v a t e s t a t i c H t t p S e s s i o n C o n t e x t
s e s s i o n C o n t e x t = n u l l ;
/ * ** T h e c u r r e n t a c c e s s e d t i m e f o r t h i s
s e s s i o n .
* /p r i v a t e l o n g thisAccessedTime =
c r e a t i o n T i m e ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - S e s s i o n P r o p e r t i e s
/ * *
* S e t t h e c r e a t i o n t i m e f o r t h i s s e s s i o n . T h i s m e t h o d i s c a l l e d b y t h e
* M a n a g e r w h e n a n e x i s t i n g S e s s i o n
i n s t a n c e i s r e u s e d .*
* @p a r a m t i m e T h e n e w c r e a t i o n t i m e
* /public void s e t C r e a t i o n T i m e ( l o n g t i m e )
{
t h i s . c r e a t i o n T i m e = time;
t h i s . l a s t A c c e s s e d T i m e = t i m e ;
t h i s . t h i s A c c e s s e d T i m e = t i m e ;
}
/ * *
* R e t u r n t h e s e s s i o n i d e n t i f i e r f o r t h i s s e s s i o n .
* /
p u b l i c S t r i n g g e t I d () {
r e t u r n ( t h i s . i d ) ;
}
/ * *
* S e t t h e s e s s i o n i d e n t i f i e r f o r t h i s
s e s s i o n .*
* @p a r a m i d T h e n e w s e s s i o n
i d e n t i f i e r* /
public void setId ( S t r i n g i d ) {
i f ( ( t h i s . i d ! = n u l l ) & & ( m a n a g e r
! = n u l l ) & &
( m a n a g e r i n s t a n c e o f M a n a g e r B a s e ) )
( (M a n a g e r B a s e )
m a n a g e r ) . r e m o v e ( t h i s ) ;
this.id = id;
i f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e r
i n s t a n c e o f M a n a g e r B a s e ) )
( (M a n a g e r B a s e ) m a n a g e r ) . a d d ( t h i s ) ;
}
/ * ** R e t u r n d e s c r i p t i v e i n f o r m a t i o n
a b o u t t h i s S e s s i o n i m p l e m e n t a t i o n a n d
* t h e c o r r e s p o n d i n g v e r s i o n n u m b e r , i n t h e f o r m a t
*
< c o d e > & lt ; d e s c r i p t i o n & g t ;/& l t ; v e r s i o n &g t ; </ c o d e > .
* /
p u b l i c S t r i n g g e t I n f o () {
return (this.info);
}
/ * *
* R e t u r n t h e l a s t t i m e t h e c l i e n t
s e n t a r e q u e s t a s s o c i a t e d w i t h t h i s* session, as the number of
m i l l i s e c o n d s s i n c e m i d n i g h t , J a n u a r y 1 ,
1 9 7 0* G M T . A c t i o n s t h a t y o u r a p p l i c a t i o n
t a k e s , s u c h a s g e t t i n g o r s e t t i n g
* a v a l u e a s s o c i a t e d w i t h t h e s e s s i o n , d o n o t a f f e c t t h e a c c e s s t i m e .
* /
public long g e t L a s t A c c e s s e d T i m e () {
return (this. l a s t A c c e s s e d T i m e );
}
/ * *
* R e t u r n t h e M a n a g e r w i t h i n w h i c h
t h i s S e s s i o n i s v a l i d .* /
p u b l i c M a n a g e r g e t M a n a g e r () {
r e t u r n ( t h i s . m a n a g e r ) ;
}
/ * ** S e t t h e M a n a g e r w i t h i n w h i c h t h i s
S e s s i o n i s v a l i d .
** @p a r a m m a n a g e r T h e n e w M a n a g e r
* /
public void s e t M a n a g e r( M a n a g e r m a n a g e r ) {
t h i s . m a n a g e r = m a n a g e r ;
}
/ * *
* R e t u r n t h e m a x i m u m t i m e i n t e r v a l , i n s e c o n d s , b e t w e e n c l i e n t r e q u e s t s
* b e f o r e t h e s e r v l e t c o n t a i n e r w i l l
i n v a l i d a t e t h e s e s s i o n . A n e g a t i v e* t i m e i n d i c a t e s t h a t t h e s e s s i o n
s h o u l d n e v e r t i m e o u t .
** @ e x c e p t i o n IllegalStateException i f
t h i s m e t h o d i s c a l l e d o n
* a n i n v a l i d a t e d s e s s i o n* /
p u b l i c i n t g e t M a x I n a c t i v e I n t e r v a l () {
/ * *
* R e t u r n t h e < c o d e > H t t p S e s s i o n < / c o d e > f o r w h i c h t h i s o b j e c t
* is the facade.
* /p u b l i c H t t p S e s s i o n g e t S e s s i o n ( ) {
r e t u r n ( ( H t t p S e s s i o n ) t h i s ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - S e s s i o n P u b l i c M e t h o d s
/ * ** U p d a t e t h e a c c e s s e d t i m e i n f o r m a t i o n f o r
t h i s s e s s i o n . T h i s m e t h o d
* s h o u l d b e c a l l e d b y t h e c o n t e x t w h e n a r e q u e s t c o m e s i n f o r a p a r t i c u l a r
* s e s s i o n , e v e n i f t h e a p p l i c a t i o n d o e s n o t
r e f e r e n c e i t .* /
p u b l i c v o i d a c c e s s ( ) {
t h i s . l a s t A c c e s s e d T i m e =
t h i s . t h i s A c c e s s e d T i m e ;
t h i s . t h i s A c c e s s e d T i m e = S y s t e m . c u r r e n t T i m e M i l l i s ();
t h i s . i s N e w = f a l s e ;
}
/ * ** P e r f o r m t h e i n t e r n a l p r o c e s s i n g r e q u i r e d t o
i n v a l i d a t e t h i s s e s s i o n ,
* w i t h o u t t r i g g e r i n g a n e x c e p t i o n i f t h e s e s s i o n h a s a l r e a d y e x p i r e d .
* /
p u b l i c v o i d e x p i r e ( ) {
/ / R e m o v e t h i s s e s s i o n f r o m o u r m a n a g e r ' s
a c t i v e s e s s i o n si f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e r
i n s t a n c e o f M a n a g e r B a s e ) )
( (M a n a g e r B a s e ) m a n a g e r ) . r e m o v e ( t h i s ) ;
/ / U n b i n d a n y o b j e c t s a s s o c i a t e d w i t h t h i s
s e s s i o nV e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = getAttributeNames ( ) ;
w h i l e ( a t t r s. h a s M o r e E l e m e n t s ()) {S t r i n g attr = ( S t r i n g )
a t t r s . n e x t E l e m e n t ( ) ;
r e s u l t s .a d d E l e m e n t ( attr) ;}
E n u m e r a t i o n n a m e s = r e s u l t s . e l e m e n t s ( ) ;
w h i l e ( n a m e s . h a s M o r e E l e m e n t s ()) {S t r i n g n a m e = ( S t r i n g )
n a m e s . n e x t E l e m e n t ( ) ;
removeAttribute ( n a m e ) ;}
/ / M a r k t h i s s e s s i o n a s i n v a l i ds e t V a l i d ( f a l s e ) ;
}
/ * ** R e l e a s e a l l o b j e c t r e f e r e n c e s , a n d
i n i t i a l i z e i n s t a n c e v a r i a b l e s , i n
* p r e p a r a t i o n f o r r e u s e o f t h i s o b j e c t .* /
p u b l i c v o i d r e c y c l e ( ) {
/ / R e s e t t h e i n s t a n c e v a r i a b l e s a s s o c i a t e d
w i t h t h i s S e s s i o n
a t t r i b u t e s . c l e a r ( ) ;c r e a t i o n T i m e = 0 L ;
i d = n u l l ;
l a s t A c c e s s e d T i m e = 0L;m a n a g e r = n u l l ;
m a x I n a c t i v e I n t e r v a l = - 1;
i s N e w = true;isValid = f a l s e ;
/ / T e l l o u r M a n a g e r t h a t t h i s S e s s i o n h a s b e e n r e c y c l e d
i f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e r
i n s t a n c e o f M a n a g e r B a s e ) )( (M a n a g e r B a s e ) m a n a g e r ) . r e c y c l e ( t h i s ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - S e s s i o n P a c k a g e M e t h o d s
/ * *
* R e t u r n t h e < c o d e > i s V a l i d < / c o d e > f l a g f o r
t h i s s e s s i o n .* /
b o o l e a n i s V a l i d () {
return (this. i s V a l i d ) ;
}
/ * ** Set the <code> i s N e w< / c o d e > f l a g f o r t h i s
s e s s i o n .
** @p a r a m i s N e w T h e n e w v a l u e f o r t h e
< c o d e > i s N e w < / c o d e > f l a g
* /v o i d setNew ( b o o l e a n i s N e w ) {
t h i s . i s N e w = i s N e w;
}
/ * *
* Set the <code> i s V a l i d < / c o d e > f l a g f o r t h i s s e s s i o n .
*
* @p a r a m i s V a l i d T h e n e w v a l u e f o r t h e < c o d e > i s V a l i d < / c o d e > f l a g
* /
v o i d s e t V a l i d ( b o o l e a n i s V a l i d ) {
t h i s . i s V a l i d = i s V a l i d ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - H t t p S e s s i o n P r o p e r t i e s
/ * *
* R e t u r n t h e t i m e w h e n t h i s s e s s i o n w a s
c r e a t e d , i n m i l l i s e c o n d s s i n c e* m i d n i g h t , J a n u a r y 1 , 1 9 7 0 G M T .
*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
* /public long g e t C r e a t i o n T i m e () {
return (this. creationTime ) ;
}
/ * *
* R e t u r n t h e s e s s i o n c o n t e x t w i t h w h i c h t h i s s e s s i o n i s a s s o c i a t e d .
*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 1 , t h i s m e t h o d i s d e p r e c a t e d a n d h a s n o
* r e p l a c e m e n t . I t w i l l b e r e m o v e d i n a
future version of the* J a v a S e r v l e t A P I .
* /
p u b l i c H t t p S e s s i o n C o n t e x t g e t S e s s i o n C o n t e x t ( ) {
i f ( s e s s i o n C o n t e x t = = n u l l )s e s s i o n C o n t e x t = n e w
S t a n d a r d S e s s i o n C o n t e x t ( ) ;
r e t u r n ( s e s s i o n C o n t e x t ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - H t t p S e s s i o n P u b l i c M e t h o d s
/ * ** R e t u r n t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d
n a m e i n t h i s s e s s i o n , o r
* < c o d e > n u l l < / c o d e > i f n o o b j e c t i s b o u n d with that name.
*
* @p a r a m n a m e N a m e o f t h e a t t r i b u t e t o b e r e t u r n e d
*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
* /p u b l i c O b j e c t g e t A t t r i b u t e ( S t r i n g n a m e ) {
r e t u r n ( a t t r i b u t e s . g e t ( n a m e ) ) ;
}
/ * *
* R e t u r n a n < c o d e > E n u m e r a t i o n < / c o d e > o f < c o d e > S t r i n g < / c o d e > o b j e c t s
* c o n t a i n i n g t h e n a m e s o f t h e o b j e c t s b o u n d
t o t h i s s e s s i o n .*
* @ e x c e p t i o n IllegalStateException i f t h i s
m e t h o d i s c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
* /
p u b l i c E n u m e r a t i o n g e t A t t r i b u t e N a m e s ( ) {
r e t u r n ( a t t r i b u t e s . k e y s ( ) ) ;
}
/ * *
* R e t u r n t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d
n a m e i n t h i s s e s s i o n , o r* < c o d e > n u l l < / c o d e > i f n o o b j e c t i s b o u n d
with that name.
** @p a r a m n a m e N a m e o f t h e v a l u e t o b e
r e t u r n e d
** @ e x c e p t i o n IllegalStateException i f t h i s
m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d
i s r e p l a c e d b y* < c o d e >g e t A t t r i b u t e( ) < / c o d e >
* /
p u b l i c O b j e c t g e t V a l u e( S t r i n g n a m e ) {
r e t u r n ( g e t A t t r i b u t e ( n a m e ) ) ;
}
/ * *
* R e t u r n t h e s e t o f n a m e s o f o b j e c t s b o u n d t o
t h i s s e s s i o n . I f t h e r e* a r e n o s u c h o b j e c t s , a z e r o - length array is
returned.
** @ e x c e p t i o n IllegalStateException i f t h i s
m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d
i s r e p l a c e d b y* < c o d e >g e t A t t r i b u t e N a m e s ()</code>
* /
p u b l i c S t r i n g [ ] getValueNames ( ) {
V e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = getAttributeNames ( ) ;w h i l e ( a t t r s. h a s M o r e E l e m e n t s ()) {
S t r i n g attr = ( S t r i n g )
a t t r s . n e x t E l e m e n t ( ) ;r e s u l t s .a d d E l e m e n t ( attr) ;
}
S t r i n g n a m e s [ ] = n e w S t r i n g [ r e s u l t s . s i z e ( ) ] ;
f o r ( int i = 0 ; i < n a m e s . l e n g t h ; i + + )
n a m e s [ i ] = ( S t r i n g ) r e s u l t s .e l e m e n t A t (i);
r e t u r n ( n a m e s ) ;
}
/ * *
* I n v a l i d a t e s t h i s s e s s i o n a n d u n b i n d s a n y
o b j e c t s b o u n d t o i t .*
* @ e x c e p t i o n IllegalStateException i f t h i s
m e t h o d i s c a l l e d o n* a n i n v a l i d a t e d s e s s i o n
* /
p u b l i c v o i d i n v a l i d a t e ( ) {
// Cause this session to expire
e x p i r e ( ) ;
}
/ * *
* R e t u r n < c o d e > t r u e < / c o d e > i f t h e c l i e n t d o e s n o t y e t k n o w a b o u t t h e
* s e s s i o n , o r i f t h e c l i e n t c h o o s e s n o t t o
j o i n t h e s e s s i o n . F o r* e x a m p l e , i f t h e s e r v e r u s e d o n l y c o o k i e -
b a s e d s e s s i o n s , a n d t h e c l i e n t
* h a s d i s a b l e d t h e u s e o f c o o k i e s , t h e n a s e s s i o n w o u l d b e n e w o n e a c h
* request.
** @ e x c e p t i o n IllegalStateException i f t h i s
m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
/ * *
* B i n d a n o b j e c t t o t h i s s e s s i o n , u s i n g t h e s p e c i f i e d n a m e . I f a n o b j e c t
* o f t h e s a m e n a m e i s a l r e a d y b o u n d t o t h i s s e s s i o n , t h e o b j e c t i s* r e p l a c e d .
* <p>
* After this method executes, and if the object implements* < c o d e > H t t p S e s s i o n B i n d i n g L i s t e n e r < / c o d e > , t h e c o n t a i n e r c a l l s
* < c o d e > v a l u e B o u n d ( ) < / c o d e > o n t h e o b j e c t .
** @ p a r a m n a m e N a m e t o w h i c h t h e o b j e c t i s b o u n d , c a n n o t b e n u l l
* @ p a r a m v a l u e O b j e c t t o b e b o u n d , c a n n o t b e n u l l
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
** @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d i s r e p l a c e d b y
* < c o d e >s e t A t t r i b u t e( ) < / c o d e >
* /public void p u t V a l u e ( S t r i n g n a m e , O b j e c t v a l u e ) {
s e t A t t r i b u t e( n a m e , v a l u e ) ;
}
/ * *
* R e m o v e t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e f r o m t h i s s e s s i o n . I f* t h e s e s s i o n d o e s n o t h a v e a n o b j e c t b o u n d w i t h t h i s n a m e , t h i s m e t h o d
* d o e s n o t h i n g .
* <p>* After this method executes, and if the object implements
* < c o d e > HttpSessionBindingListener < / c o d e > , t h e c o n t a i n e r c a l l s
* < c o d e > v a l u e U n b o u n d ( ) < / c o d e > o n t h e o b j e c t .*
* @p a r a m n a m e N a m e o f t h e o b j e c t t o r e m o v e f r o m t h i s s e s s i o n .
** @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
* /public void r e m o v e A t t r i b u t e (String name) {
s y n c h r o n i z e d ( a t t r i b u t e s ) {O b j e c t o b j e c t = a t t r i b u t e s . g e t ( n a m e ) ;
i f ( o b j e c t = = n u l l )
r e t u r n ;a t t r i b u t e s . r e m o v e ( n a m e ) ;
/ / S y s t e m . o u t . p r i n t l n( " R e m o v i n g a t t r i b u t e " + n a m e ) ;
if (object i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r ) {( ( H t t p S e s s i o n B i n d i n g L i s t e n e r) o b j e c t ) . v a l u e U n b o u n d
( n e w H t t p S e s s i o n B i n d i n g E v e n t ( (H t t p S e s s i o n ) this, name));
}}
}
/ * ** R e m o v e t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e f r o m t h i s s e s s i o n . I f
* t h e s e s s i o n d o e s n o t h a v e a n o b j e c t b o u n d w i t h t h i s n a m e , t h i s m e t h o d
* d o e s n o t h i n g .* <p>
* After this method executes, and if the object implements
* < c o d e > HttpSessionBindingListener < / c o d e > , t h e c o n t a i n e r c a l l s* < c o d e > v a l u e U n b o u n d ( ) < / c o d e > o n t h e o b j e c t .
*
* @p a r a m n a m e N a m e o f t h e o b j e c t t o r e m o v e f r o m t h i s s e s s i o n .*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d i s r e p l a c e d b y
* < c o d e >r e m o v e A t t r i b u t e ( ) < / c o d e >* /
public void removeValue ( S t r i n g n a m e ) {
r e m o v e A t t r i b u t e ( n a m e ) ;
}
/ * ** B i n d a n o b j e c t t o t h i s s e s s i o n , u s i n g t h e s p e c i f i e d n a m e . I f a n o b j e c t
* o f t h e s a m e n a m e i s a l r e a d y b o u n d t o t h i s s e s s i o n , t h e o b j e c t i s
* r e p l a c e d .* <p>
* After this method executes, and if the object implements
* < c o d e > HttpSessionBindingListener < / c o d e > , t h e c o n t a i n e r c a l l s* < c o d e > v a l u e B o u n d ( ) < / c o d e > o n t h e o b j e c t .
*
* @p a r a m n a m e N a m e t o w h i c h t h e o b j e c t i s b o u n d , c a n n o t b e n u l l* @p a r a m v a l u e O b j e c t t o b e b o u n d , c a n n o t b e n u l l
*
* @ e x c e p t i o n I l l e g a l A r g u m e n t E x c e p t i o n i f a n a t t e m p t i s m a d e t o a d d a* n o n - s e r i a l i z a b l e o b j e c t i n a n e n v i r o n m e n t m a r k e d d i s t r i b u t a b l e .
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n* /
public void s e t A t t r i b u t e ( S t r i n g n a m e , O b j e c t v a l u e ) {
i f ( ( m a n a g e r ! = n u l l ) & & m a n a g e r . getDistributable ( ) & &
! ( v a l u e i n s t a n c e o f S e r i a l i z a b l e ) )
throw new I l l e g a l A r g u m e n t E x c e p t i o n( s m .g e t S t r i n g ( " s t a n d a r d S e s s i o n . s e t A t t r i b u t e . iae " ) ) ;
s y n c h r o n i z e d ( a t t r i b u t e s ) {removeAttribute ( n a m e ) ;
a t t r i b u t e s . p u t ( n a m e , v a l u e ) ;
if (value i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r )( ( H t t p S e s s i o n B i n d i n g L i s t e n e r) v a l u e ) . valueBound
( n e w H t t p S e s s i o n B i n d i n g E v e n t ( (H t t p S e s s i o n ) this, name));
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HttpSession P r i v a t e M e t h o d s
/ * *
* R e a d a s e r i a l i z e d v e r s i o n o f t h i s s e s s i o n o b j e c t f r o m t h e s p e c i f i e d* o b j e c t i n p u t s t r e a m .
* <p>
* < b > I M P L E M E N T A T I O N N O T E < / b > : T h e r e f e r e n c e t o t h e o w n i n g M a n a g e r* i s n o t r e s t o r e d b y t h i s m e t h o d , a n d m u s t b e s e t e x p l i c i t l y .
*
* @p a r a m s t r e a m T h e i n p u t s t r e a m t o r e a d f r o m*
* @ e x c e p t i o n C l a s s N o t F o u n d E x c e p t i o n i f a n u n k n o w n c l a s s i s s p e c i f i e d
* @ e x c e p t i o n I O E x c e p t i o n i f a n i n p u t / o u t p u t e r r o r o c c u r s* /
p r i v a t e v o i d readObject ( ObjectInputStream s t r e a m )
t h r o w s C l a s s N o t F o u n d E x c e p t i o n , I O E x c e p t i o n {
/ / D e s e r i a l i z e t h e s c a l a r i n s t a n c e v a r i a b l e s ( e x c e p t M a n a g e r )
c r e a t i o n T i m e = ( ( L o n g ) s t r e a m .r e a d O b j e c t ()).l o n g V a l u e ();i d = ( S t r i n g ) s t r e a m . readObject ( ) ;
l a s t A c c e s s e d T i m e = ( ( L o n g ) s t r e a m . r e a d O b j e c t ( ) ) .l o n g V a l u e ( ) ;
m a x I n a c t i v e I n t e r v a l = ( ( I n t e g e r ) s t r e a m . r e a d O b j e c t ( ) ) .i n t V a l u e ( ) ;i s N e w = ( ( B o o l e a n ) s t r e a m . r e a d O b j e c t( ) ) . b o o l e a n V a l u e ();
isValid = ( ( B o o l e a n ) s t r e a m . r e a d O b j e c t ( ) ) .b o o l e a n V a l u e( ) ;
/ / D e s e r i a l i z e the attribute count and attribute values
i n t n = ( ( I n t e g e r ) s t r e a m . r e a d O b j e c t( ) ) . i n t V a l u e( ) ;
f o r ( int i = 0 ; i < n ; i + + ) {S t r i n g n a m e = ( S t r i n g ) s t r e a m . r e a d O b j e c t ( ) ;
O b j e c t v a l u e = ( O b j e c t ) s t r e a m . r e a d O b j e c t ( ) ;
a t t r i b u t e s . p u t ( n a m e , v a l u e ) ;}
}
/ * ** W r i t e a s e r i a l i z e d v e r s i o n o f t h i s s e s s i o n o b j e c t t o t h e s p e c i f i e d
* o b j e c t o u t p u t s t r e a m .
* <p>* < b > I M P L E M E N T A T I O N N O T E < / b > : T h e o w n i n g M a n a g e r w i l l n o t b e s t o r e d
* i n t h e s e r i a l i z e d r e p r e s e n t a t i o n o f t h i s S e s s i o n . A f t e r c a l l i n g
* < c o d e > r e a d O b j e c t ( ) < / c o d e > , y o u m u s t s e t t h e a s s o c i a t e d M a n a g e r* e x p l i c i t l y .
* <p>
* < b > I M P L E M E N T A T I O N N O T E < / b > : A n y a t t r i b u t e t h a t i s n o t S e r i a l i z a b l e* w i l l b e s i l e n t l y i g n o r e d . I f y o u d o n o t w a n t a n y s u c h a t t r i b u t e s ,
* b e s u r e t h e < c o d e > d i s t r i b u t a b l e < / c o d e > p r o p e r t y o f o u r a s s o c i a t e d
* M a n a g e r i s s e t t o < c o d e > t r u e < / c o d e > .*
* @p a r a m s t r e a m T h e o u t p u t s t r e a m t o w r i t e t o
** @ e x c e p t i o n I O E x c e p t i o n i f a n i n p u t / o u t p u t e r r o r o c c u r s
* /
p r i v a t e v o i d w r i t e O b j e c t ( O b j e c t O u t p u t S t r e a m s t r e a m ) t h r o w s I O E x c e p t i o n {
/ / W r i t e t h e s c a l a r i n s t a n c e v a r i a b l e s ( e x c e p t M a n a g e r )
stream. w r i t e O b j e c t( n e w L o n g ( c r e a t i o n T i m e ));stream. w r i t e O b j e c t( i d ) ;
stream. w r i t e O b j e c t( n e w L o n g ( l a s t A c c e s s e d T i m e ) ) ;
stream. w r i t e O b j e c t(new Integer( m a x I n a c t i v e I n t e r v a l ) ) ;stream. w r i t e O b j e c t(new Boolean( i s N e w) ) ;
stream. w r i t e O b j e c t(new Boolean( i s V a l i d ) ) ;
/ / A c c u m u l a t e t h e n a m e s o f s e r i a l i z a b l e a t t r i b u t e s
V e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = getAttributeNames ( ) ;w h i l e ( a t t r s. h a s M o r e E l e m e n t s ()) {
S t r i n g attr = ( S t r i n g ) a t t r s . n e x t E l e m e n t ( ) ;
O b j e c t v a l u e = a t t r i b u t e s . g e t ( attr) ;if (value instanceof Serializable )
r e s u l t s . a d d E l e m e n t ( attr ) ;
}
/ / S e r i a l i z e t h e a t t r i b u t e c o u n t a n d t h e a t t r i b u t e v a l u e s
stream. w r i t e O b j e c t( n e w I n t e g e r ( r e s u l t s . s i z e ( ) ) ) ;E n u m e r a t i o n n a m e s = r e s u l t s . e l e m e n t s ( ) ;
w h i l e ( n a m e s . h a s M o r e E l e m e n t s ()) {
S t r i n g n a m e = ( S t r i n g ) n a m e s . n e x t E l e m e n t ( ) ;s t r e a m . w r i t e O b j e c t ( n a m e ) ;
s t r e a m . w r i t e O b j e c t ( a t t r i b u t e s . g e t ( n a m e ) ) ;
}
}
c r o s s c u t i n v a l i d a t e ( StandardSession s ) : s & ( int getMaxInactiveInterval ( ) |
long getCreationTime ( ) |O b j e c t g e t A t t r i b u t e( S t r i n g ) |
E n u m e r a t i o n g e t A t t r i b u t e N a m e s () |
String[] g e t V a l u e N a m e s () |v o i d i n v a l i d a t e ( ) |
b o o l e a n i s N e w( ) |
void removeAttribute ( S t r i n g ) |void s e t A t t r i b u t e (String,
Object));
s t a t i c a d v i c e ( StandardSession s ) : i n v a l i d a t e ( s ) {
b e f o r e {
i f ( ! s . i s V a l i d( ) )t h r o w n e w I l l e g a l S t a t e E x c e p t i o n
( s . s m .g e t S t r i n g ( " s t a n d a r d S e s s i o n . "
+ thisJoinPoint . m e t h o d N a m e+ " . i s e "));
}
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P r i v a t e C l a s s
/ * *
* T h i s c l a s s i s a d u m m y i m p l e m e n t a t i o n o f t h e < c o d e > H t t p S e s s i o n C o n t e x t < / c o d e >* i n t e r f a c e , t o c o n f o r m t o t h e r e q u i r e m e n t t h a t s u c h a n o b j e c t be returned
* w h e n < c o d e >H t t p S e s s i o n .g e t S e s s i o n C o n t e x t ()</code> is called.
** @ a u t h o r C r a i g R . M c C l a n a h a n
*
* @ d e p r e c a t e d A s o f J a v a Servlet A P I 2 . 1 w i t h n o r e p l a c e m e n t . T h e* i n t e r f a c e w i l l b e r e m o v e d i n a f u t u r e v e r s i o n o f t h i s A P I .
* /
f i n a l c l a s s S t a n d a r d S e s s i o n C o n t e x t implements H t t p S e s s i o n C o n t e x t {
p r i v a t e V e c t o r d u m m y = n e w V e c t o r ( ) ;
/ * ** R e t u r n t h e s e s s i o n i d e n t i f i e r s o f a l l s e s s i o n s d e f i n e d
* w i t h i n t h i s c o n t e x t .
** @ d e p r e c a t e d A s o f J a v a S e r v l e t A P I 2 . 1 w i t h n o r e p l a c e m e n t .
* T h i s m e t h o d m u s t r e t u r n a n e m p t y < c o d e > E n u m e r a t i o n < / c o d e >
* a n d w i l l b e r e m o v e d i n a f u t u r e v e r s i o n o f t h e A P I .* /
p u b l i c E n u m e r a t i o n g e t I d s () {
r e t u r n ( d u m m y . e l e m e n t s ( ) ) ;
}
/ * ** R e t u r n t h e < c o d e > H t t p S e s s i o n < / c o d e > a s s o c i a t e d w i t h t h e
* s p e c i f i e d s e s s i o n i d e n t i f i e r .
** @p a r a m i d S e s s i o n i d e n t i f i e r f o r w h i c h t o l o o k u p a s e s s i o n
*
* @ d e p r e c a t e d A s o f J a v a S e r v l e t A P I 2 . 1 w i t h n o r e p l a c e m e n t .* T h i s m e t h o d m u s t r e t u r n n u l l a n d w i l l b e r e m o v e d i n a
* f u t u r e v e r s i o n o f t h e A P I .
* /p u b l i c HttpSession getSession ( S t r i n g i d ) {
r e t u r n ( n u l l ) ;
}
}
StandardSession
p a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t j a v a . i o . I O E x c e p t i o n ;
i m p o r t j a v a . u t i l . E n u m e r a t i o n ;i m p o r t j a v a . u t i l . H a s h t a b l e ;
i m p o r t j a v a . u t i l . V e c t o r ;
i m p o r t o r g . a p a c h e . t o m c a t . c a t a l i n a . * ;i m p o r t j a v a x . s e r v l e t . h t t p . C o o k i e ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;i m p o r t o r g . w 3 c . d o m . N a m e d N o d e M a p ;
i m p o r t o r g . w 3 c . d o m . N o d e ;
/ * *
* S t a n d a r d i m p l e m e n t a t i o n o f t h e < b > M a n a g e r < / b > i n t e r f a c e t h a t p r o v i d e s* n o s e s s i o n p e r s i s t e n c e o r d i s t r i b u t a b l e c a p a b i l i t i e s , b u t d o e s s u p p o r t
* a n o p t i o n a l , c o n f i g u r a b l e , m a x i m u m n u m b e r o f a c t i v e s e s s i o n s a l l o w e d .
* < p >* L i f e c y c l e c o n f i g u r a t i o n o f t h i s c o m p o n e n t a s s u m e s a n X M L n o d e
* i n t h e f o l l o w i n g f o r m a t :
* <code>* &l t ; M a n a g e r className= " o r g . a p a c h e . t o m c a t . s e s s i o n .S t a n d a r d M a n a g e r "
* c h e c k I n t e r v a l = " 6 0 " m a x A c t i v e S e s s i o n s = " - 1"
* m a x I n a c t i v e I n t e r v a l = " -1 " / >* < / c o d e >
* w h e r e y o u c a n a d j u s t t h e f o l l o w i n g p a r a m e t e r s , w i t h d e f a u l t v alues
* i n s q u a r e b r a c k e t s :* < u l >
* < l i ><b>c h e c k I n t e r v a l </b> - T h e i n t e r v a l ( i n s e c o n d s ) b e t w e e n b a c k g r o u n d
* t h r e a d c h e c k s f o r e x p i r e d s e s s i o n s . [ 6 0 ]* < l i ><b>maxActiveSessions < / b > - T h e m a x i m u m n u m b e r o f s e s s i o n s a l l o w e d t o
* b e a c t i v e a t o n c e , o r - 1 f o r n o l i m i t . [ - 1]
* < l i ><b>m a x I n a c t i v e I n t e r v a l </b> - T h e d e f a u l t m a x i m u m n u m b e r o f s e c o n d s o f* i n a c t i v i t y b e f o r e w h i c h t h e s e r v l e t container is allowed to time out
* a session, or - 1 f o r n o l i m i t . T h i s v a l u e s h o u l d b e o v e r r i d d e n f r o m
* t h e d e f a u l t s e s s i o n t i m e o u t s p e c i f i e d i n t h e w e b a p p l i c a t i o n d e p l o y m e n t* d e s c r i p t o r , i f a n y . [ - 1 ]
* < / u l >
** @ a u t h o r C r a i g R . M c C l a n a h a n
* @ v e r s i o n $ R e v i s i o n : 1 . 1 . 1 . 1 $ $ D a t e : 2 0 0 0 / 0 5 / 0 2 2 1 : 2 8 : 3 0 $
* /
p u b l i c f i n a l c l a s s S t a n d a r d M a n a g e r
e x t e n d s M a n a g e r B a s ei m p l e m e n t s L i f e c y c l e , R u n n a b l e {
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - I n s t a n c e V a r i a b l e s
/ * *
* T h e i n t e r v a l ( i n s e c o n d s ) b e t w e e n c h e c k s f o r e x p i r e d s e s s ions.
* /p r i v a t e i n t c h e c k I n t e r v a l = 6 0 ;
/ * *
* H a s t h i s c o m p o n e n t b e e n c o n f i g u r e d y e t ?
* /p r i v a t e b o o l e a n configured = false;
/ * *
* T h e d e s c r i p t i v e i n f o r m a t i o n a b o u t t h i s i m p l e m e n t a t i o n .
* /p r i v a t e s t a t i c f i n a l S t r i n g i n f o = " S t a n d a r d M a n a g e r / 1 . 0 " ;
/ * *
* T h e m a x i m u m n u m b e r o f a c t i v e S e s s i o n s a l l o w e d , o r - 1 f o r n o l i m i t .
* /p r o t e c t e d i n t m a x A c t i v e S e s s i o n s = - 1 ;
/ * *
* T h e s t r i n g m a n a g e r f o r t h i s p a c k a g e .
* /p r i v a t e S t r i n g M a n a g e r s m =
StringManager . g e t M a n a g e r( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;
/ * *
* H a s t h i s c o m p o n e n t b e e n s t a r t e d y e t ?* /
p r i v a t e b o o l e a n s t a r t e d = f a l s e ;
/ * *
* T h e b a c k g r o u n d t h r e a d .* /
p r i v a t e T h r e a d t h r e a d = n u l l ;
/ * *
* T h e b a c k g r o u n d t h r e a d c o m p l e t i o n s e m a p h o r e .* /
p r i v a t e b o o l e a n t h r e a d D o n e = false;
/ * *
* N a m e t o r e g i s t e r f o r t h e b a c k g r o u n d t h r e a d .* /
p r i v a t e S t r i n g t h r e a d N a m e = " S t a n d a r d M a n a g e r " ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P r o p e r t i e s
/ * *
* R e t u r n t h e c h e c k i n t e r v a l ( i n s e c o n d s ) f o r t h i s M a n a g e r .* /
p u b l i c i n t g e t C h e c k I n t e r v a l () {
return (this. c h e c k I n t e r v a l ) ;
}
/ * ** S e t t h e c h e c k i n t e r v a l ( i n s e c o n d s ) f o r t h i s M a n a g e r .
*
* @p a r a m c h e c k I n t e r v a l T h e n e w c h e c k i n t e r v a l* /
public void s e t C h e c k I n t e r v a l( i n t c h e c k I n t e r v a l) {
t h i s . c h e c k I n t e r v a l = c h e c k I n t e r v a l ;
}
/ * ** R e t u r n d e s c r i p t i v e i n f o r m a t i o n a b o u t t h i s M a n a g e r i m p l e m e ntation and
* t h e c o r r e s p o n d i n g v e r s i o n n u m b e r , i n t h e f o r m a t
* < c o d e > &l t ; d e s c r i p t i o n & g t ;/&l t ;version& g t ; < / c o d e > .* /
p u b l i c S t r i n g g e t I n f o () {
return (this.info);
}
/ * ** R e t u r n t h e m a x i m u m n u m b e r o f a c t i v e S e s s i o n s a l l o w e d , o r - 1 for
* no limit.
* /p u b l i c i n t g e t M a x A c t i v e S e s s i o n s () {
return (this. m a x A c t i v e S e s s i o n s) ;
}
/ * *
* S e t t h e m a x i m u m n u m b e r o f a c t i v e s S e s s i o n s a l l o w e d , o r - 1 f o r* no limit.
*
* @p a r a m m a x T h e n e w m a x i m u m n u m b e r o f s e s s i o n s* /
public void s e t M a x A c t i v e S e s s i o n s ( int m a x ) {
t h i s . m a x A c t i v e S e s s i o n s = m a x ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P u b l i c M e t h o d s
/ * ** C o n s t r u c t a n d r e t u r n a n e w s e s s i o n o b j e c t , b a s e d o n t h e d e f a u l t
* s e t t i n g s s p e c i f i e d b y t h i s M a n a g e r ' s p r o p e r t i e s . T h e s e s s i o n
* i d w i l l b e a s s i g n e d b y t h i s m e t h o d , a n d a v a i l a b l e v i a t h e g e t I d ( )* m e t h o d o f t h e r e t u r n e d s e s s i o n . I f a n e w s e s s i o n c a n n o t b e c r e a t e d
* f o r a n y r e a s o n , r e t u r n < c o d e > n u l l < / c o d e > .
** @ e x c e p t i o n IllegalStateException i f a n e w s e s s i o n c a n n o t b e
* i n s t a n t i a t e d f o r a n y r e a s o n
* /p u b l i c S e s s i o n c r e a t e S e s s i o n( ) {
i f ( ( m a x A c t i v e S e s s i o n s >= 0) &&( s e s s i o n s . s i z e ( ) > = m a x A c t i v e S e s s i o n s ) )
throw new I l l e g a l S t a t e E x c e p t i o n
( s m .g e t S t r i n g ( " s t a n d a r d M a n a g e r . c r e a t e S e s s i o n . ise" ) ) ;
r e t u r n ( s u p e r . c r e a t e S e s s i o n ());
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
L i f e c y c l e M e t h o d s
/ * ** C o n f i g u r e t h i s c o m p o n e n t , b a s e d o n t h e s p e c i f i e d
c o n f i g u r a t i o n
* p a r a m e t e r s . T h i s m e t h o d s h o u l d b e c a l l e d i m m e d i a t e l y a f t e r t h e
* c o m p o n e n t i n s t a n c e i s c r e a t e d , a n d b e f o r e
< c o d e > s t a r t ( ) < / c o d e >* i s c a l l e d .
*
* @ p a r a m p a r a m e t e r s C o n f i g u r a t i o n p a r a m e t e r s f o r t h i s component
* ( < B > F I X M E : W h a t o b j e c t t y p e s h o u l d t h i s r e a l l y b e ? )
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s
a l r e a d y b e e n
* c o n f i g u r e d a n d / o r s t a r t e d* @ e x c e p t i o n L i f e c y c l e E x c e p t i o n i f t h i s c o m p o n e n t d e t e c t s a
f a t a l e r r o r
* i n t h e c o n f i g u r a t i o n p a r a m e t e r s i t w a s g i v e n* /
p u b l i c v o i d c o n f i g u r e ( N o d e p a r a m e t e r s )
t h r o w s L i f e c y c l e E x c e p t i o n {
/ / V a l i d a t e a n d u p d a t e o u r c u r r e n t c o m p o n e n t s t a t e
i f ( c o n f i g u r e d )t h r o w n e w L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . a l r e a d y C o n f i g u r e d " ) ) ;c o n f i g u r e d = t r u e ;
i f ( p a r a m e t e r s = = n u l l )
r e t u r n ;
/ / P a r s e a n d p r o c e s s o u r c o n f i g u r a t i o n p a r a m e t e r s
i f ( ! ( " M a n a g e r " . e q u a l s ( p a r a m e t e r s . g e t N o d e N a m e ( ) ) ) )r e t u r n ;
N a m e d N o d e M a p a t t r i b u t e s = p a r a m e t e r s . g e t A t t r i b u t e s ( ) ;
N o d e n o d e = n u l l ;
n o d e = a t t r i b u t e s . g e t N a m e d I t e m ( " c h e c k I n t e r v a l " ) ;
i f ( n o d e ! = n u l l ) {try {
s e t C h e c k I n t e r v a l ( I n t e g e r . p a r s e I n t ( n o d e . g e t N o d e V a l u e ( ) ) ) ;} c a t c h ( T h r o w a b l e t ) {
; / / X X X - T h r o w e x c e p t i o n ?
}}
n o d e = a t t r i b u t e s . g e t N a m e d I t e m ( " m a x A c t i v e S e s s i o n s " ) ;i f ( n o d e ! = n u l l ) {
try {
s e t M a x A c t i v e S e s s i o n s ( I n t e g e r . p a r s e I n t ( n o d e . g e t N o d e V a l u e ( ) ) ) ;
} c a t c h ( T h r o w a b l e t ) {
; / / X X X - T h r o w e x c e p t i o n ?}
}
n o d e = a t t r i b u t e s . g e t N a m e d I t e m ( " m a x I n a c t i v e I n t e r v a l " ) ;
i f ( n o d e ! = n u l l ) {
try {
s e t M a x I n a c t i v e I n t e r v a l ( I n t e g e r . p a r s e I n t ( n o d e . g e t N o d e V a l u e ( ) ) ) ;
} c a t c h ( T h r o w a b l e t ) {; / / X X X - T h r o w e x c e p t i o n ?
}
}
}
/ * *
* P r e p a r e f o r t h e b e g i n n i n g o f a c t i v e u s e o f t h e p u b l i c
m e t h o d s o f t h i s* c o m p o n e n t . T h i s m e t h o d s h o u l d b e c a l l e d a f t e r
< c o d e > c o n f i g u r e ( ) < / c o d e > ,
* a n d b e f o r e a n y o f t h e p u b l i c m e t h o d s o f t h e c o m p o n e n t a r eutilized.
*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s n o t y e t b e e n
* c o n f i g u r e d ( i f r e q u i r e d f o r t h i s c o m p o n e n t )
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s a l r e a d y b e e n
* started
* @ e x c e p t i o n L i f e c y c l e E x c e p t i o n i f t h i s c o m p o n e n t d e t e c t s af a t a l e r r o r
* t h a t p r e v e n t s t h i s c o m p o n e n t f r o m b e i n g u s e d
* /p u b l i c v o i d s t a r t ( ) t h r o w s L i f e c y c l e E x c e p t i o n {
/ / V a l i d a t e a n d u p d a t e o u r c u r r e n t c o m p o n e n t s t a t ei f ( ! c o n f i g u r e d )
t h r o w n e w L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . n o t C o n f i g u r e d " ) ) ;i f ( s t a r t e d )
t h r o w n e w L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . a l r e a d y S t a r t e d " ) ) ;s t a r t e d = t r u e ;
/ / S t a r t t h e b a c k g r o u n d r e a p e r t h r e a dt h r e a d S t a r t ( ) ;
}
/ * ** G r a c e f u l l y t e r m i n a t e t h e a c t i v e u s e o f t h e p u b l i c m e t h o d s o f
t h i s
* c o m p o n e n t . T h i s m e t h o d s h o u l d b e t h e l a s t o n e c a l l e d o n a g i v e n
* i n s t a n c e o f t h i s c o m p o n e n t .
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s n o t
b e e n s t a r t e d
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s a l r e a d y
* b e e n s t o p p e d
* @ e x c e p t i o n L i f e c y c l e E x c e p t i o n i f t h i s c o m p o n e n t d e t e c t s af a t a l e r r o r
* that needs to be reported
* /p u b l i c v o i d s t o p ( ) t h r o w s L i f e c y c l e E x c e p t i o n {
/ / V a l i d a t e a n d u p d a t e o u r c u r r e n t c o m p o n e n t s t a t eif (!started)
t h r o w n e w L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . n o t S t a r t e d " ) ) ;s t a r t e d = f a l s e ;
/ / S t o p t h e b a c k g r o u n d r e a p e r t h r e a dthreadStop();
/ / E x p i r e a l l a c t i v e s e s s i o n sS e s s i o n s e s s i o n s [ ] = f i n d S e s s i o n s ( ) ;
f o r ( i n t i = 0 ; i < s e s s i o n s . l e n g t h ; i + + ) {
S t a n d a r d S e s s i o n s e s s i o n = ( S t a n d a r d S e s s i o n ) s e s s i o n s [ i ] ;
i f ( ! s e s s i o n . i s V a l i d ( ) )
c o n t i n u e ;s e s s i o n . e x p i r e ( ) ;
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
P r i v a t e M e t h o d s
/ * *
* I n v a l i d a t e a l l s e s s i o n s t h a t h a v e e x p i r e d .* /
p r i v a t e v o i d p r o c e s s E x p i r e s ( ) {
l o n g t i m e N o w = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ;
S e s s i o n s e s s i o n s [ ] = f i n d S e s s i o n s ( ) ;
f o r ( i n t i = 0 ; i < s e s s i o n s . l e n g t h ; i + + ) {
S t a n d a r d S e s s i o n s e s s i o n = ( S t a n d a r d S e s s i o n )
s e s s i o n s [ i ] ;i f ( ! s e s s i o n . i s V a l i d ( ) )
c o n t i n u e ;
i n t m a x I n a c t i v e I n t e r v a l = s e s s i o n . g e t M a x I n a c t i v e I n t e r v a l ( ) ;
i f ( m a x I n a c t i v e I n t e r v a l < 0 )
c o n t i n u e ;i n t t i m e I d l e = / / T r u n c a t e , d o n o t r o u n d u p
( i n t ) ( ( t i m e N o w - s e s s i o n . g e t L a s t A c c e s s e d T i m e ( ) ) /
1 0 0 0 L ) ;i f ( t i m e I d l e > = m a x I n a c t i v e I n t e r v a l )
session.expire();
}}
/ * *
* S l e e p f o r t h e d u r a t i o n s p e c i f i e d b y t h e
< c o d e > c h e c k I n t e r v a l < / c o d e >* p r o p e r t y .
* /
p r i v a t e v o i d t h r e a d S l e e p ( ) {
t r y {
T h r e a d . s l e e p ( c h e c k I n t e r v a l * 1 0 0 0 L ) ;} c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {
;
}
}
/ * *
* S t a r t t h e b a c k g r o u n d t h r e a d t h a t w i l l p e r i o d i c a l l y c h e c k f o r* s e s s i o n t i m e o u t s .
* /
p r i v a t e v o i d t h r e a d S t a r t ( ) {
if (thread != null)
r e t u r n ;
threadDone = false;
t h r e a d = n e w T h r e a d ( t h i s , t h r e a d N a m e ) ;t h r e a d . s e t D a e m o n ( t r u e ) ;
t h r e a d . s t a r t ( ) ;
}
/ * *
* S t o p t h e b a c k g r o u n d t h r e a d t h a t i s p e r i o d i c a l l y c h e c k i n g f o r
* s e s s i o n t i m e o u t s .* /
p r i v a t e v o i d t h r e a d S t o p ( ) {
if (thread == null)
r e t u r n ;
t h r e a d D o n e = t r u e ;
t h r e a d . i n t e r r u p t ( ) ;
t r y {t h r e a d . j o i n ( ) ;
StandardManager
StandardSessionManagerp a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t j a v a . i o . I O E x c e p t i o n ;
i m p o r t j a v a x . s e r v l e t . h t t p . C o o k i e ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . c a t a l i n a . * ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . C o n t e x t ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . R e q u e s t ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . R e s p o n s e ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . S e s s i o n M a n a g e r ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S e s s i o n U t i l ;
/ * *
* S p e c i a l i z e d i m p l e m e n t a t i o n o f o r g . a p a c h e . t o m c a t . c o r e . S e s s i o n M a n a g e r
* t h a t a d a p t s t o t h e n e w c o m p o n e n t - b a s e d M a n a g e r i m p l e m e n t a t i o n .
* < p >
* X X X - A t p r e s e n t , u s e o f < c o d e > S t a n d a r d M a n a g e r < / c o d e > i s
h a r d c o d e d ,
* a n d l i f e c y c l e c o n f i g u r a t i o n i s n o t s u p p o r t e d .
* < p >
* < b > I M P L E M E N T A T I O N N O T E < / b > : O n c e w e c o m m i t t o t h e n e w M a n a g e r / S e s s i o n
* p a r a d i g m , I w o u l d s u g g e s t m o v i n g t h e l o g i c i m p l e m e n t e d h e r e b a c k i n t o
* t h e c o r e l e v e l . T h e T o m c a t . N e x t " M a n a g e r " i n t e r f a c e
a c t s m o r e l i k e a
* c o l l e c t i o n c l a s s , a n d h a s m i n i m a l k n o w l e d g e o f t h e
d e t a i l e d r e q u e s t
* p r o c e s s i n g s e m a n t i c s o f h a n d l i n g s e s s i o n s .
* < p >
* X X X - At present, there is no way (via the
S e s s i o n M a n a g e r i n t e r f a c e ) f o r
* a C o n t e x t t o t e l l t h e M a n a g e r t h a t w e c r e a t e w h a t t h e
d e f a u l t s e s s i o n
* t i m e o u t f o r t h i s w e b a p p l i c a t i o n ( s p e c i f i e d i n t h e d e p l o y m e n t d e s c r i p t o r )
* s h o u l d b e .
*
* @ a u t h o r C r a i g R . M c C l a n a h a n
* /
p u b l i c f i n a l c l a s s S t a n d a r d S e s s i o n M a n a g e r
i m p l e m e n t s S e s s i o n M a n a g e r {
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - C o n s t r u c t o r s
/ * *
* C r e a t e a n e w S e s s i o n M a n a g e r t h a t a d a p t s t o t h e
c o r r e s p o n d i n g M a n a g e r
* i m p l e m e n t a t i o n .
* /
p u b l i c StandardSessionManager ( ) {
manager = new S t a n d a r d M a n a g e r ();
i f ( m a n a g e r i n s t a n c e o f L i f e c y c l e ) {
try {
( ( L i f e c y c l e ) m a n a g e r ) . c o n f i g u r e ( n u l l ) ;
( ( L i f e c y c l e ) m a n a g e r ) . s t a r t ( ) ;
} c a t c h ( LifecycleException e ) {
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( " " + e ) ;
}
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- I n s t a n c e V a r i a b l e s
/ * *
* T h e M a n a g e r i m p l e m e n t a t i o n w e a r e a c t u a l l y u s i n g .
* /
p r i v a t e M a n a g e r m a n a g e r = n u l l ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- P u b l i c M e t h o d s
/ * *
* M a r k t h e s p e c i f i e d s e s s i o n ' s l a s t a c c e s s e d t i m e .
T h i s s h o u l d b e
* c a l l e d f o r e a c h r e q u e s t b y a R e q u e s t I n t e r c e p t o r .
*
* @ p a r a m s e s s i o n T h e s e s s i o n t o b e m a r k e d
* /
p u b l i c v o i d a c c e s s e d ( C o n t e x t c t x , R e q u e s t r e q , S t r i n g
i d ) {
H t t p S e s s i o n s e s s i o n = f i n d S e s s i o n ( c t x , i d ) ;
i f ( s e s s i o n = = n u l l ) r e t u r n ;
i f ( s e s s i o n i n s t a n c e o f S e s s i o n )
( ( S e s s i o n ) s e s s i o n ) . a c c e s s ( ) ;
/ / c a c h e t h e H t t p S e s s i o n - a v o i d a n o t h e r f i n d
r e q . s e t S e s s i o n ( s e s s i o n ) ;
}
/ / X X X s h o u l d w e t h r o w e x c e p t i o n o r j u s t r e t u r n n u l l ? ?
p u b l i c H t t p S e s s i o n f i n d S e s s i o n ( C o n t e x t c t x , S t r i n g i d ) {
t r y {
S e s s i o n s e s s i o n = m a n a g e r .f i n d S e s s i o n ( i d ) ;
i f ( s e s s i o n ! = n u l l )
r e t u r n s e s s i o n . g e t S e s s i o n ( ) ;
} c a t c h ( I O E x c e p t i o n e) {
}
r e t u r n ( n u l l ) ;
}
p u b l i c H t t p S e s s i o n c r e a t e S e s s i o n ( C o n t e x t c t x ) {
r e t u r n m a n a g e r . c r e a t e S e s s i o n ().g e t S e s s i o n( ) ;
}
/ * *
* R e m o v e a l l s e s s i o n s b e c a u s e o u r a s s o c i a t e d C o n t e x t i s b e i n g s h u t d o w n .
*
* @p a r a m c t x T h e c o n t e x t t h a t i s b e i n g s h u t d o w n
* /
public void r e m o v e S e s s i o n s ( C o n t e x t c t x ) {
/ / X X X X X X a m a n a g e r m a y b e s h a r e d b y m u l t i p l e
/ / c o n t e x t s , w e j u s t w a n t t o r e m o v e t h e s e s s i o n s o f
c t x !
/ / T h e m a n a g e r w i l l s t i l l r u n a f t e r t h a t ( i . e .
k e e p d a t a b a s e
/ / c o n n e c t i o n o p e n
i f ( m a n a g e r i n s t a n c e o f L i f e c y c l e ) {
try {
( ( L i f e c y c l e ) m a n a g e r ) . s t o p ( ) ;
} c a t c h ( LifecycleException e ) {
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( " " + e ) ;
}
}
}
/ * *
* U s e d b y c o n t e x t t o c o n f i g u r e t h e s e s s i o n m a n a g e r ' s
i n a c t i v i t y t i m e o u t .
*
* The S e s s i o n M a n a g e r m a y h a v e s o m e d e f a u l t s e s s i o n
t i m e o u t , t h e
* C o n t e x t o n t h e o t h e r h a n d h a s i t ' s t i m e o u t s e t b y
t h e d e p l o y m e n t
* d e s c r i p t o r ( w e b . x m l) . T h i s m e t h o d l e t s t h e C o n t e x t
c o n f o r g u r e t h e
* s e s s i o n m a n a g e r a c c o r d i n g t o t h i s v a l u e .
*
* @p a r a m m i n u t e s T h e s e s s i o n i n a c t i v i t y t i m e o u t i n
m i n u t e s .
* /
public void setSessionTimeOut ( i n t m i n u t e s ) {
i f ( - 1 ! = m i n u t e s ) {
/ / T h e m a n a g e r w o r k s w i t h s e c o n d s . . .
m a n a g e r .s e t M a x I n a c t i v e I n t e r v a l (minutes * 60);
}
}
}
ServerSessionManagerp a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . * ;i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;
i m p o r t j a v a . i o . * ;
i m p o r t j a v a . n e t . * ;i m p o r t j a v a . u t i l . * ;
i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * *
*
* @ a u t h o r J a m e s D u n c a n D a v i d s o n [ d u n c a n @ e n g . s u n . c o m ]* @ a u t h o r J a s o n H u n t e r [ j c h @ e n g . s u n . c o m ]
* @ a u t h o r J a m e s T o d d [ g o n z o @ e n g . s u n . c o m ]
* /
p u b l i c c l a s s S e r v e r S e s s i o n M a n a g e r i m p l e m e n t s S e s s i o n M a n a g e r {
p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;
p r i v a t e s t a t i c S e r v e r S e s s i o n M a n a g e r m a n a g e r ; / / = n e w S e r v e r SessionManager();
p r o t e c t e d i n t i n a c t i v e I n t e r v a l = -1 ;
s t a t i c {
manager = new S e r v e r S e s s i o n M a n a g e r ();
}
p u b l i c s t a t i c S e r v e r S e s s i o n M a n a g e r g e t M a n a g e r () {
r e t u r n m a n a g e r ;}
p r i v a t e Hashtable s e s s i o n s = n e w Hashtable( ) ;p r i v a t e R e a p e r r e a p e r ;
p r i v a t e S e r v e r S e s s i o n M a n a g e r( ) {r e a p e r = R e a p e r . getReaper ( ) ;
reaper. s e t S e r v e r S e s s i o n M a n a g e r(this);
r e a p e r . s t a r t ( ) ;}
p u b l i c v o i d a c c e s s e d ( C o n t e x t c t x , Request r e q, S t r i n g i d ) {A p p l i c a t i o n S e s s i o n a p S = (A p p l i c a t i o n S e s s i o n) f i n d S e s s i o n( c t x , i d ) ;
i f ( apS = = n u l l ) r e t u r n ;
ServerSession servS = a p S .g e t S e r v e r S e s s i o n ();
s e r v S . a c c e s s e d ( ) ;
a p S . a c c e s s e d ( ) ;
/ / c a c h e i t - n o n e e d t o c o m p u t e i t a g a i n
r e q . s e t S e s s i o n ( apS ) ;}
p u b l i c H t t p S e s s i o n c r e a t e S e s s i o n ( C o n t e x t c t x ) {S t r i n g s e s s i o n I d = SessionIdGenerator . g e n e r a t e I d( ) ;
ServerSession s e s s i o n = n e w S e r v e r S e s s i o n (s e s s i o n I d ) ;
sessions.put( s e s s i o n I d , s e s s i o n ) ;
i f ( - 1 ! = inactiveInterval ) {
s e s s i o n . s e t M a x I n a c t i v e I n t e r v a l( i n a c t i v e I n t e r v a l );}
r e t u r n s e s s i o n . g e t A p p l i c a t i o n S e s s i o n( c t x , t r u e ) ;
}
p u b l i c H t t p S e s s i o n f i n d S e s s i o n ( C o n t e x t ctx, S t r i n g i d ) {
S e r v e r S e s s i o n s S e s s i o n = (ServerSession )sessions.get(id);i f ( s S e s s i o n ==null) return null;
r e t u r n s S e s s i o n . getApplicationSession ( c t x , false);}
/ / X X X/ / s y n c ' d f o r s a f t y - - n o o t h e r t h r e a d s h o u l d b e g e t t i n g s o m e t h i n g
/ / f r o m t h i s w h i l e w e a r e r e a p i n g . T h i s i s n ' t t h e m o s t o p t i m a l
/ / s o l u t i o n f o r t h i s , b u t w e ' l l d e t e r m i n e s o m e t h i n g e l s e l a t e r .
s y n c h r o n i z e d v o i d r e a p ( ) {
E n u m e r a t i o n e n u m = s e s s i o n s . k e y s ( ) ;
w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {
O b j e c t k e y = e n u m . n e x t E l e m e n t ( ) ;S e r v e r S e s s i o n s e s s i o n = ( S e r v e r S e s s i o n ) s e s s i o n s . g e t ( key);
session.reap();s e s s i o n . v a l i d a t e ( ) ;
}
}
s y n c h r o n i z e d v o i d r e m o v e S e s s i o n ( S e r v e r S e s s i o n s e s s i o n ) {
S t r i n g i d = s e s s i o n . getId ( ) ;
s e s s i o n . i n v a l i d a t e ( ) ;
s e s s i o n s . r e m o v e ( i d ) ;}
public void r e m o v e S e s s i o n s ( C o n t e x t c o n t e x t ) {E n u m e r a t i o n e n u m = s e s s i o n s . k e y s ( ) ;
w h i l e ( e n u m .h a s M o r e E l e m e n t s ()) {O b j e c t k e y = enum. n e x t E l e m e n t ( ) ;
S e r v e r S e s s i o n s e s s i o n = ( S e r v e r S e s s i o n) s e s s i o n s . g e t ( k e y ) ;
A p p l i c a t i o n S e s s i o n a p p S e s s i o n =s e s s i o n . getApplicationSession ( c o n t e x t , f a l s e ) ;
if (a p p S e s s i o n ! = n u l l ) {a p p S e s s i o n. i n v a l i d a t e ( ) ;
}
}}
/ * ** U s e d b y c o n t e x t t o c o n f i g u r e t h e s e s s i o n m a n a g e r ' s i n a c t i v i t y t i m e o u t .
*
* The S e s s i o n M a n a g e r m a y h a v e s o m e d e f a u l t s e s s i o n t i m e o u t , t h e* C o n t e x t o n t h e o t h e r h a n d h a s i t ' s t i m e o u t s e t b y t h e d e p l o y m e n t
* d e s c r i p t o r ( w e b . x m l) . T h i s m e t h o d l e t s t h e C o n t e x t c o n f o r g u r e t h e
* s e s s i o n m a n a g e r a c c o r d i n g t o t h i s v a l u e .*
* @p a r a m m i n u t e s T h e s e s s i o n i n a c t i v i t y t i m e o u t i n m i n u t e s .
* /public void setSessionTimeOut ( i n t m i n u t e s ) {
i f ( - 1 ! = m i n u t e s ) {
/ / T h e m a n a g e r w o r k s w i t h s e c o n d s . . .i n a c t i v e I n t e r v a l = ( m i n u t e s * 6 0 ) ;
}
}}
SessionInterceptor
p a c k a g e o r g . a p a c h e . t o m c a t . r e q u e s t ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . * ;
i m p o r t j a v a . i o . * ;i m p o r t j a v a . n e t . * ;
i m p o r t j a v a . u t i l . * ;
i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * *
* W i l l p r o c e s s t h e r e q u e s t a n d d e t e r m i n e t h e s e s s i o n I d , a n d s e t i t* i n t h e R e q u e s t .
* I t a l s o m a r k s t h e s e s s i o n a s a c c e s s e d .
** T h i s i m p l e m e n t a t i o n o n l y h a n d l e s C o o k i e s s e s s i o n s , p l e a s e e x t e n d o r
* a d d n e w i n t e r c e p t o r s f o r o t h e r m e t h o d s .
** /
p u b l i c c l a s s S e s s i o n I n t e r c e p t o r e x t e n d s B a s e I n t e r c e p t o r i m p l e m e n t s R e q u e s t I n t e r c e p t o r {
/ / G S , s e p a r a t e s t h e s e s s i o n i d f r o m t h e j v m r o u t e
s t a t i c f i n a l c h a r S E S S I O N I D _ R O U T E _ S E P = ' . ' ;
i n t d e b u g = 0 ;C o n t e x t M a n a g e r cm;
p u b l i c S e s s i o n I n t e r c e p t o r () {}
public void s e t D e b u g ( i n t i ) {S y s t e m . o u t . p r i n t l n( " S e t d e b u g t o " + i ) ;
d e b u g = i ;
}
public void setContextManager ( C o n t e x t M a n a g e r c m ) {
t h i s . c m = c m ;}
p u b l i c i n t r e q u e s t M a p (Request request ) {S t r i n g s e s s i o n I d = n u l l ;
C o o k i e c o o k i e s [ ] = r e q u e s t . g e t C o o k i e s (); // assert !=null
f o r ( int i = 0 ; i < c o o k i e s . l e n g t h ; i + + ) {
C o o k i e c o o k i e = c o o k i e s [ i ] ;
i f ( c o o k i e . g e t N a m e ( ) . e q u a l s ( " J S E S S I O N I D " ) ) {
s e s s i o n I d = c o o k i e . g e t V a l u e ();s e s s i o n I d =v a l i d a t e S e s s i o n I d (request, s e s s i o n I d) ;
i f (s e s s i o n I d ! = n u l l ) {
r e q u e s t . s e t R e q u e s t e d S e s s i o n I d F r o m C o o k i e ( t r u e ) ;}
}
}
S t r i n g s i g ="; j s e s s i o n i d =";
i n t f o u n d A t =- 1 ;i f ( d e b u g > 0 ) c m . l o g ( " X X X R U R I = " + r e q u e s t . g e t R e q u e s t U R I ());
i f ( ( f o u n d A t= r e q u e s t . g e t R e q u e s t U R I (). i n d e x O f ( s i g) ) ! = - 1){
sessionId = r e q u e s t . g e t R e q u e s t U R I ().s u b s t r i n g (foundAt + s i g . l e n g t h ( ) ) ;/ / r e w r i t e U R L , d o I n e e d t o d o a n y t h i n g m o r e ?
r e q u e s t .setRequestURI ( r e q u e s t . g e t R e q u e s t U R I ().s u b s t r i n g (0, f o u n d A t ));
sessionId = validateSessionId ( r e q u e s t , sessionId) ;if (s e s s i o n I d !=null){
r e q u e s t . s e t R e q u e s t e d S e s s i o n I d F r o m U R L ( t r u e ) ;
}}
r e t u r n 0 ;
}
/ / X X X w h a t i s t h e c o r r e c t b e h a v i o r i f t h e s e s s i o n i s i n v a l i d ?
/ / W e m a y s t i l l s e t i t a n d j u s t r e t u r n s e s s i o n i n v a l i d .
/ * * V a l i d a t e a n d f i x t h e s e s s i o n i d . I f t h e s e s s i o n i s n o t v alid return null.
* It will also clean up the session from load - b a l a n c i n g s t r i n g s .* @ r e t u r n s e s s i o n I d , o r n u l l i f n o t v a l i d
* /
p r i v a t e S t r i n g v a l i d a t e S e s s i o n I d ( R e q u e s t r e q u e s t , S t r i n g sessionId) {/ / G S , W e p i g g y b a c k t h e J V M i d o n t o p o f t h e s e s s i o n c o o k i e
/ / S e p a r a t e t h e m . . .
i f ( d e b u g > 0 ) c m . l o g ( " Orig sessionId " + s e s s i o n I d );
i f ( n u l l ! = s e s s i o n I d ) {
i n t i d e x = s e s s i o n I d. l a s t I n d e x O f( S E S S I O N I D _ R O U T E _ S E P ) ;if( i d e x > 0 ) {
s e s s i o n I d = s e s s i o n I d .s u b s t r i n g ( 0 , i d e x );
}}
i f ( sessionId ! = n u l l & & s e s s i o n I d . l e n g t h ( ) ! = 0 ) {/ / G S , W e a r e i n a p r o b l e m h e r e , w e m a y a c t u a l l y g e t
/ / m u l t i p l e S e s s i o n c o o k i e s ( o n e f o r t h e r o o t
/ / c o n t e x t a n d o n e f o r t h e r e a l c o n t e x t . . . o r o l d s e ssion/ / c o o k i e . W e m u s t c h e c k f o r v a l i d i t y i n t h e c u r r e n t c o n t e x t .
C o n t e x t c t x = r e q u e s t .g e t C o n t e x t ();
S e s s i o n M a n a g e r s M = c t x . g e t S e s s i o n M a n a g e r (); i f ( n u l l ! = s M .f i n d S e s s i o n (c t x , sessionId) ) {
s M . a c c e s s e d ( c t x , request, sessionId ) ;
r e q u e s t . setRequestedSessionId ( s e s s i o n I d );i f ( d e b u g > 0 ) c m . l o g ( " F i n a l s e s s i o n i d " + sessionId ) ;
r e t u r n s e s s i o n I d;
}}
r e t u r n n u l l ;
}
p u b l i c i n t b e f o r e B o d y ( R e q u e s t r r e q u e s t , R e s p o n s e r e s p o n s e ) {S t r i n g r e q S e s s i o n I d = r e s p o n s e . g e t S e s s i o n I d ( ) ;
i f ( d e b u g > 0 ) c m . l o g ( " B e f o r e B o d y " + r e q S e s s i o n I d ) ;
i f ( r e q S e s s i o n I d = = n u l l )return 0;
/ / G S , s e t t h e p a t h a t t r i b u t e t o t h e c o o k i e . T h i s w a y
/ / m u l t i p l e s e s s i o n c o o k i e s c a n b e u s e d , o n e f o r e a c h
/ / c o n t e x t .S t r i n g s e s s i o n P a t h = r r e q u e s t . g e t C o n t e x t ( ) . g e t P a t h ( ) ;
i f ( s e s s i o n P a t h . l e n g t h ( ) = = 0 ) {
s e s s i o n P a t h = " / " ;}
// GS, piggyback the jvm route on the session id.i f ( ! s e s s i o n P a t h . e q u a l s ( " / " ) ) {
S t r i n g jvmRoute = r r e q u e s t. g e t J v m R o u t e( ) ;
i f ( n u l l ! = j v m R o u t e ) {r e q S e s s i o n I d = r e q S e s s i o n I d + S E S S I O N I D _ R O U T E _ S E P + j v m R o u t e ;
}
}
C o o k i e c o o k i e = n e w C o o k i e ( " J S E S S I O N I D " ,
r e q S e s s i o n I d ) ;cookie. s e t M a x A g e ( -1 ) ;
cookie. s e t P a t h ( s e s s i o n P a t h ) ;
cookie. s e t V e r s i o n (1);
r e s p o n s e . a d d H e a d e r( CookieTools . g e t C o o k i e H e a d e r N a m e ( c o o k i e ) ,
CookieTools . g e t C o o k i e H e a d e r V a l u e ( c o o k i e ) ) ;cookie. s e t V e r s i o n (0);
r e s p o n s e . a d d H e a d e r( CookieTools . g e t C o o k i e H e a d e r N a m e ( c o o k i e ) ,
CookieTools . g e t C o o k i e H e a d e r V a l u e ( c o o k i e ) ) ;
r e t u r n 0 ;
}
/ * * N o t i f i c a t i o n o f c o n t e x t s h u t d o w n* /
public void c o n t e x t S h u t d o w n ( Context c t x )
t h r o w s T o m c a t E x c e p t i o n{
i f ( ctx . g e t D e b u g ( ) > 0 ) c t x . l o g ( " R e m o v i n g s e s s i o n s f r o m " + c t x );
c t x . g e t S e s s i o n M a n a g e r ( ) .r e m o v e S e s s i o n s ( c t x) ;}
}
ServerSession
p a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;i m p o r t j a v a . i o . * ;
i m p o r t j a v a . n e t . * ;
i m p o r t j a v a . u t i l . * ;i m p o r t j a v a x . s e r v l e t . * ;
i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * *
* C o r e i m p l e m e n t a t i o n o f a s e r v e r s e s s i o n
** @ a u t h o r J a m e s D u n c a n D a v i d s o n [ d u n c a n @ e n g . s u n . c o m ]
* @ a u t h o r J a m e s T o d d [ g o n z o @ e n g . s u n . c o m ]
* /
p u b l i c c l a s s S e r v e r S e s s i o n {
p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;
p r i v a t e H a s h t a b l e v a l u e s = n e w H a s h t a b l e ( ) ;p r i v a t e H a s h t a b l e a p p S e s s i o n s = n e w H a s h t a b l e ( ) ;
p r i v a t e S t r i n g i d ;
p r i v a t e l o n g c r e a t i o n T i m e = System. c u r r e n t T i m e M i l l i s( ) ; ;p r i v a t e l o n g t h i s A c c e s s T i m e = c r e a t i o n T i m e ;
p r i v a t e l o n g l a s t A c c e s s e d = c r e a t i o n T i m e;
p r i v a t e i n t i n a c t i v e I n t e r v a l = - 1 ;
S e r v e r S e s s i o n ( S t r i n g i d ) {
this.id = id;}
p u b l i c S t r i n g g e t I d () {r e t u r n i d ;
}
public long g e t C r e a t i o n T i m e () {
r e t u r n creationTime ;
}
public long g e t L a s t A c c e s s e d T i m e () {
r e t u r n lastAccessed ;}
p u b l i c A p p l i c a t i o n S e s s i o n g e t A p p l i c a t i o n S e s s i o n ( C o n t e x t c o n t e x t ,boolean c r e a t e ) {
A p p l i c a t i o n S e s s i o n a p p S e s s i o n =
( A p p l i c a t i o n S e s s i o n )a p p S e s s i o n s .get(context);
i f ( a p p S e s s i o n = = n u l l & & c r e a t e ) {
/ / X X X
/ / s y n c t o e n s u r e v a l i d ?
a p p S e s s i o n = new A p p l i c a t i o n S e s s i o n ( i d , t h i s , c o n t e x t ) ;
a p p S e s s i o n s . p u t ( c o n t e x t , a p p S e s s i o n ) ;
}
/ / X X X
/ / m a k e s u r e t h a t w e h a v e n ' t g o n e o v e r t h e e n d o f o u r/ / i n a c t i v e i n t e r v a l - - i f s o , i n v a l i d a t e a n d c r e a t e
/ / a n e w appSession
r e t u r n a p p S e s s i o n ;
}
v o i d r e m o v e A p p l i c a t i o n S e s s i o n ( C o n t e x t c o n t e x t ) {
a p p S e s s i o n s . r e m o v e ( c o n t e x t ) ;
}
/ * *
* C a l l e d b y c o n t e x t w h e n r e q u e s t c o m e s i n s o t h a t a c c e s s e s a n d* i n a c t i v i t i e s c a n b e d e a l t w i t h a c c o r d i n g l y .
* /
v o i d a c c e s s e d ( ) {
/ / s e t l a s t a c c e s s e d t o t h i s A c c e s s T i m e a s i t w i l l b e l e f t o v e r
/ / f r o m t h e p r e v i o u s a c c e s s
l a s t A c c e s s e d = t h i s A c c e s s T i m e ;
t h i s A c c e s s T i m e = S y s t e m .c u r r e n t T i m e M i l l i s ();
}
v o i d v a l i d a t e ( )
v o i d v a l i d a t e ( ) {
/ / i f w e h a v e a n i n a c t i v e i n t e r v a l , c h e c k t o s e e i f/ / w e ' v e e x c e e d e d i t
i f ( i n a c t i v e I n t e r v a l ! = - 1 ) {i n t t h i s I n t e r v a l =
( i n t ) ( S y s t e m . c u r r e n t T i m e M i l l i s ( ) - l a s t A c c e s s e d ) / 1 0 0 0 ;
i f ( t h i s I n t e r v a l > i n a c t i v e I n t e r v a l ) {
i n v a l i d a t e ( ) ;
S e r v e r S e s s i o n M a n a g e r s s m =
S e r v e r S e s s i o n M a n a g e r . g e t M a n a g e r ( ) ;
s s m . r e m o v e S e s s i o n ( t h i s ) ;
}
}}
s y n c h r o n i z e d v o i d i n v a l i d a t e ( ) {E n u m e r a t i o n e n u m = a p p S e s s i o n s . k e y s ( ) ;
w h i l e ( e n u m .h a s M o r e E l e m e n t s ()) {O b j e c t k e y = enum. n e x t E l e m e n t ( ) ;
A p p l i c a t i o n S e s s i o n a p p S e s s i o n =
( A p p l i c a t i o n S e s s i o n ) a p p S e s s i o n s .get(key);
a p p S e s s i o n . i n v a l i d a t e ( ) ;
}}
public void p u t V a l u e ( S t r i n g n a m e , O b j e c t v a l u e ) {i f ( n a m e = = n u l l ) {
S t r i n g msg = sm.g e t S t r i n g (" s e r v e r S e s s i o n . v a l u e . i a e" ) ;
throw new I l l e g a l A r g u m e n t E x c e p t i o n ( m s g) ;
}
r e m o v e V a l u e ( n a m e ) ; / / r e m o v e a n y e x i s t i n g b i n d i n g
v a l u e s . p u t ( n a m e , v a l u e ) ;
}
p u b l i c O b j e c t g e t V a l u e( S t r i n g n a m e ) {
i f ( n a m e = = n u l l ) {S t r i n g msg = sm.g e t S t r i n g (" s e r v e r S e s s i o n . v a l u e . i a e" ) ;
throw new I l l e g a l A r g u m e n t E x c e p t i o n ( m s g) ;}
r e t u r n v a l u e s . g e t ( n a m e ) ;}
p u b l i c E n u m e r a t i o n g e t V a l u e N a m e s () {r e t u r n v a l u e s . k e y s ( ) ;
}
public void removeValue ( S t r i n g n a m e ) {
v a l u e s . r e m o v e ( n a m e ) ;
}
public void s e t M a x I n a c t i v e I n t e r v a l( i n t i n t e r v a l ) {
i n a c t i v e I n t e r v a l = i n t e r v a l ;}
p u b l i c i n t g e t M a x I n a c t i v e I n t e r v a l () {r e t u r n i n a c t i v e I n t e r v a l ;
}
/ / X X X
/ / s y n c ' d f o r s a f t y - - n o o t h e r t h r e a d s h o u l d b e g e t t i n g s o m e t h i n g
/ / f r o m t h i s w h i l e w e a r e r e a p i n g . T h i s i s n ' t t h e m o s t o p t i m a l/ / s o l u t i o n f o r t h i s , b u t w e ' l l d e t e r m i n e s o m e t h i n g e l s e l a t e r .
s y n c h r o n i z e d v o i d r e a p ( ) {E n u m e r a t i o n e n u m = a p p S e s s i o n s. k e y s ( ) ;
w h i l e ( e n u m .h a s M o r e E l e m e n t s ()) {O b j e c t k e y = enum. n e x t E l e m e n t ( ) ;
A p p l i c a t i o n S e s s i o n a p p S e s s i o n =
( A p p l i c a t i o n S e s s i o n ) a p p S e s s i o n s .get(key);
a p p S e s s i o n . v a l i d a t e ( ) ;
}}
}
/ ** = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*
* T h e A p a c h e S o f t w a r e L i c e n s e , V e r s i o n 1 . 1*
* C o p y r i g h t ( c ) 1 9 9 9 T h e A p a c h e S o f t w a r e F o u n d a t i o n . A l l r i g h t s
* r e s e r v e d .*
* R e d i s t r i b u t i o n a n d u s e i n s o u r c e a n d b i n a r y f o r m s , w i t h o r w i thout
* m o d i f i c a t i o n , a r e p e r m i t t e d p r o v i d e d t h a t t h e f o l l o w i n g c o n d i tions* a r e m e t :
*
* 1 . R e d i s t r i b u t i o n s o f s o u r c e c o d e m u s t r e t a i n t h e a b o v e c o p y r i g h t* n o t i c e , t h i s l i s t o f c o n d i t i o n s a n d t h e f o l l o w i n g d i s c l a i m e r .
*
* 2 . R e d i s t r i b u t i o n s i n b i n a r y f o r m m u s t r e p r o d u c e t h e a b o v e c o p y r i g h t* n o t i c e , t h i s l i s t o f c o n d i t i o n s a n d t h e f o l l o w i n g d i s c l a i m er in
* t h e d o c u m e n t a t i o n a n d / o r o t h e r m a t e r i a l s p r o v i d e d w i t h t h e
* d i s t r i b u t i o n .*
* 3 . T h e e n d -u s e r d o c u m e n t a t i o n i n c l u d e d w i t h t h e r e d i s t r i b u t i o n , i f
* a n y , m u s t i n c l u d e t h e f o l l o w i n g a c k n o w l e g e m e n t :* " T h i s p r o d u c t i n c l u d e s s o f t w a r e d e v e l o p e d b y t h e
* A p a c h e S o f t w a r e F o u n d a t i o n ( h t t p : / / w w w . a p a c h e . o r g / ) . "
* A l t e r n a t e l y , t h i s a c k n o w l e g e m e n t m a y a p p e a r i n t h e s o f t w a r ei t s e l f ,
* i f a n d w h e r e v e r s u c h t h i r d- p a r t y a c k n o w l e g e m e n t s n o r m a l l y a p p e a r .
** 4 . T h e n a m e s " T h e J a k a r t a P r o j e c t " , " T o m c a t " , a n d " A p a c h e S o f tware
* F o u n d a t i o n " m u s t n o t b e u s e d t o e n d o r s e o r p r o m o t e p r o d u c t s
d e r i v e d* f r o m t h i s s o f t w a r e w i t h o u t p r i o r w r i t t e n p e r m i s s i o n . F o r w r i t t e n
* p e r m i s s i o n , p l e a s e c o n t a c t a p a c h e @ a p a c h e . o r g .
** 5 . P r o d u c t s d e r i v e d f r o m t h i s s o f t w a r e m a y n o t b e c a l l e d " A p a c h e "
* n o r m a y " A p a c h e " a p p e a r i n t h e i r n a m e s w i t h o u t p r i o r w r i t t e n
* p e r m i s s i o n o f t h e A p a c h e G r o u p .*
* T H I S S O F T W A R E I S P R O V I D E D ` ` A S I S ' ' A N D A N Y E X P R E S S E D O R I M P L I E D
* W A R R A N T I E S , I N C L U D I N G , B U T N O T L I M I T E D T O , T H E I M P L I E D W A R R A N T I E S* O F M E R C H A N T A B I L I T Y A N D F I T N E S S F O R A P A R T I C U L A R P U R P O S E A R E
* D I S C L A I M E D . I N N O E V E N T S H A L L T H E A P A C H E S O F T W A R E F O U N D A T I O N O R
* I T S C O N T R I B U T O R S B E L I A B L E F O R A N Y D I R E C T , I N D I R E C T , I N C I D E N T A L ,* S P E C I A L , E X E M P L A R Y , O R C O N S E Q U E N T I A L D A M A G E S ( I N C L U D I N G , B U T N O T
* L I M I T E D T O , P R O C U R E M E N T O F S U B S T I T U T E G O O D S O R S E R V I C E S ; L O S S O F
* U S E , D A T A , O R P R O F I T S ; O R B U S I N E S S I N T E R R U P T I O N ) H O W E V E R C A U S E D A N D* O N A N Y T H E O R Y O F L I A B I L I T Y , W H E T H E R I N C O N T R A C T , S T R I C T L I A B I LITY,
* O R T O R T ( I N C L U D I N G N E G L I G E N C E O R O T H E R W I S E ) A R I S I N G I N A N Y W A Y OUT
* O F T H E U S E O F T H I S S O F T W A R E , E V E N I F A D V I S E D O F T H E P O S S I B I L I TY OF* S U C H D A M A G E .
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
** T h i s s o f t w a r e c o n s i s t s o f v o l u n t a r y c o n t r i b u t i o n s m a d e b y m a n y
* i n d i v i d u a l s o n b e h a l f o f t h e A p a c h e S o f t w a r e F o u n d a t i o n . F o r more
* i n f o r m a t i o n o n t h e A p a c h e S o f t w a r e F o u n d a t i o n , p l e a s e s e e* < h t t p : / / w w w . a p a c h e . o r g / > .
*
* [ A d d i t i o n a l n o t i c e s , i f r e q u i r e d b y p r i o r l i c e n s i n g c o n d i t i o n s ]*
* /
p a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;i m p o r t j a v a . i o . * ;
i m p o r t j a v a . n e t . * ;
i m p o r t j a v a . u t i l . * ;i m p o r t j a v a x . s e r v l e t . * ;
i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * *
* C o r e i m p l e m e n t a t i o n o f a n a p p l i c a t i o n l e v e l s e s s i o n
** @ a u t h o r J a m e s D u n c a n D a v i d s o n [ d u n c a n @ e n g . s u n . c o m ]
* @ a u t h o r J a s o n H u n t e r [ jch@ e n g . s u n . c o m ]
* @ a u t h o r J a m e s T o d d [ g o n z o @ e n g . s u n . c o m ]* /
p u b l i c c l a s s A p p l i c a t i o n S e s s i o n i m p l e m e n t s H t t p S e s s i o n {
p r i v a t e S t r i n g M a n a g e r s m =
StringManager . g e t M a n a g e r( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;p r i v a t e Hashtable v a l u e s = n e w H a s h t a b l e( ) ;
p r i v a t e S t r i n g i d ;
p r i v a t e S e r v e r S e s s i o n s e r v e r S e s s i o n ;p r i v a t e C o n t e x t c o n t e x t ;
p r i v a t e l o n g c r e a t i o n T i m e = System. c u r r e n t T i m e M i l l i s( ) ; ;
p r i v a t e l o n g t h i s A c c e s s T i m e = c r e a t i o n T i m e ;p r i v a t e boolean v a l i d = t r u e ;
A p p l i c a t i o n S e s s i o n (String id, S e r v e r S e s s i o n s e r v e r S e s s i o n ,C o n t e x t c o n t e x t ) {
t h i s . s e r v e r S e s s i o n = s e r v e r S e s s i o n ;
t h i s . c o n t e x t = c o n t e x t ;this.id = id;
t h i s . i n a c t i v e I n t e r v a l = c o n t e x t . getSessionTimeOut ( ) ;
i f ( t h i s . inactiveInterval ! = -1 ) {
t h i s . inactiveInterval * = 6 0 ;}
}
S e r v e r S e s s i o n g e t S e r v e r S e s s i o n ( ) {
r e t u r n s e r v e r S e s s i o n ;
}
/ * *
* C a l l e d b y c o n t e x t w h e n r e q u e s t c o m e s i n s o t h a t a c c e s s e s a n d* i n a c t i v i t i e s c a n b e d e a l t w i t h a c c o r d i n g l y .
* /
/ / H T T P S E S S I O N I M P L E M E N T A T I O N M E T H O D S
p u b l i c S t r i n g g e t I d () {
i f ( v a l i d ) {
return id;} e l s e {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}
}
public long g e t C r e a t i o n T i m e () {
i f ( v a l i d ) {r e t u r n c r e a t i o n T i m e ;
} e l s e {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}}
/ * **
* @ d e p r e c a t e d
* /
p u b l i c H t t p S e s s i o n C o n t e x t g e t S e s s i o n C o n t e x t () {
r e t u r n n e w S e s s i o n C o n t e x t I m p l ();}
p u b l i c v o i d i n v a l i d a t e ( ) {s e r v e r S e s s i o n . r e m o v e A p p l i c a t i o n S e s s i o n ( c o n t e x t ) ;
/ / r e m o v e e v e r y t h i n g i n t h e s e s s i o n
E n u m e r a t i o n e n u m = v a l u e s . k e y s ( ) ;
w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {S t r i n g n a m e = ( S t r i n g ) e n u m . n e x t E l e m e n t ( ) ;
r e m o v e V a l u e ( n a m e ) ;
}
v a l i d = f a l s e ;
}
p u b l i c b o o l e a n i s N e w ( ) {
i f ( ! v a l i d ) {S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;}
i f ( t h i s A c c e s s T i m e = = c r e a t i o n T i m e ) {r e t u r n t r u e ;
} e l s e {
r e t u r n f a l s e ;}
}
/ * *
* @ d e p r e c a t e d* /
public void p u t V a l u e ( S t r i n g n a m e , O b j e c t v a l u e ) {s e t A t t r i b u t e( n a m e , v a l u e ) ;
}
public void s e t A t t r i b u t e ( S t r i n g n a m e , O b j e c t v a l u e ) {
i f ( ! v a l i d ) {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}
i f ( n a m e = = n u l l ) {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . v a l u e . i a e ");
throw new I l l e g a l A r g u m e n t E x c e p t i o n ( m s g) ;
}
r e m o v e V a l u e ( n a m e ) ; / / r e m o v e a n y e x i s t i n g b i n d i n g
i f ( v a l u e ! = n u l l & & v a l u e i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r ) {
H t t p S e s s i o n B i n d i n g E v e n t e =
n e w H t t p S e s s i o n B i n d i n g E v e n t ( t h i s , n a m e ) ;
( ( H t t p S e s s i o n B i n d i n g L i s t e n e r ) v a l u e ) . v a l u e B o u n d ( e ) ;
}
v a l u e s . p u t ( n a m e , v a l u e ) ;
}
/ * *
* @ d e p r e c a t e d* /
p u b l i c O b j e c t g e t V a l u e ( S t r i n g n a m e ) {
r e t u r n g e t A t t r i b u t e ( n a m e ) ;}
p u b l i c O b j e c t g e t A t t r i b u t e ( S t r i n g n a m e ) {i f ( ! v a l i d ) {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;
}
i f ( n a m e = = n u l l ) {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . v a l u e . i a e " ) ;
t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( m s g ) ;
}
r e t u r n v a l u e s . g e t ( n a m e ) ;
}
/ * *
* @ d e p r e c a t e d
* /p u b l i c S t r i n g [ ] getValueNames ( ) {
E n u m e r a t i o n e = g e t A t t r i b u t e N a m e s ( ) ;
V e c t o r n a m e s = n e w V e c t o r ( ) ;
w h i l e ( e . h a s M o r e E l e m e n t s( ) ) {
n a m e s . a d d E l e m e n t ( e . n e x t E l e m e n t ());}
S t r i n g [ ] valueNames = n e w S t r i n g [ n a m e s . s i z e ( ) ] ;
n a m e s .c o p y I n t o ( valueNames ) ;
r e t u r n v a l u e N a m e s ;
}
p u b l i c E n u m e r a t i o n g e t A t t r i b u t e N a m e s ( ) {
i f ( ! v a l i d ) {S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;}
H a s h t a b l e v a l u e s C l o n e = ( H a s h t a b l e ) v a l u e s . c l o n e ( ) ;
r e t u r n ( E n u m e r a t i o n ) valuesClone . k e y s ( ) ;
}
/ * ** @ d e p r e c a t e d
* /
public void removeValue ( S t r i n g n a m e ) {
r e m o v e A t t r i b u t e ( n a m e ) ;
}
public void r e m o v e A t t r i b u t e (String name) {
i f ( ! v a l i d ) {S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;}
i f ( n a m e = = n u l l ) {S t r i n g msg = sm.g e t S t r i n g (" applicationSession . v a l u e . i a e ");
throw new I l l e g a l A r g u m e n t E x c e p t i o n ( m s g) ;}
O b j e c t o = v a l u e s . g e t ( n a m e ) ;
i f ( o i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r ) {
H t t p S e s s i o n B i n d i n g E v e n t e =n e w H t t p S e s s i o n B i n d i n g E v e n t ( t h i s , n a m e ) ;
( (H t t p S e s s i o n B i n d i n g L i s t e n e r ) o ) .v a l u e U n b o u n d( e ) ;}
v a l u e s . r e m o v e ( n a m e ) ;}
public void s e t M a x I n a c t i v e I n t e r v a l( i n t i n t e r v a l ) {i f ( ! v a l i d ) {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}
i n a c t i v e I n t e r v a l = i n t e r v a l ;
}
p u b l i c i n t g e t M a x I n a c t i v e I n t e r v a l () {
i f ( ! v a l i d ) {
S t r i n g msg = sm.g e t S t r i n g (" applicationSession . s e s s i o n . ise " ) ;
throw new I l l e g a l S t a t e E x c e p t i o n (m s g ) ;
}
r e t u r n i n a c t i v e I n t e r v a l ;
}}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ApplicationSession p a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t j a v a . i o . I O E x c e p t i o n ;i m p o r t j a v a . i o . O b j e c t I n p u t S t r e a m ;
i m p o r t j a v a . i o . O b j e c t O u t p u t S t r e a m ;
i m p o r t j a v a . i o . S e r i a l i z a b l e ;i m p o r t j a v a . u t i l . E n u m e r a t i o n ;
i m p o r t j a v a . u t i l . H a s h t a b l e ;
i m p o r t j a v a . u t i l . V e c t o r ;i m p o r t j a v a x . s e r v l e t . S e r v l e t E x c e p t i o n ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n B i n d i n g E v e n t
;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n B i n d i n g L i s t e
n e r ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n C o n t e x t ;
i m p o r t o r g . a p a c h e . t o m c a t . c a t a l i n a . * ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;
/ * *
* S t a n d a r d i m p l e m e n t a t i o n o f t h e
< b > S e s s i o n < / b > i n t e r f a c e . T h i s o b j e c t i s* serializable , s o t h a t i t c a n b e s t o r e d
i n p e r s i s t e n t s t o r a g e o r t r a n s f e r r e d
* t o a d i f f e r e n t J V M f o r d i s t r i b u t a b l e s e s s i o n s u p p o r t .
* < p >
* < b > I M P L E M E N T A T I O N N O T E < / b > : A n i n s t a n c e o f t h i s c l a s s r e p r e s e n t s b o t h t h e
* i n t e r n a l ( S e s s i o n ) a n d a p p l i c a t i o n
l e v e l ( H t t p S e s s i o n ) v i e w o f t h e s e s s i o n .* H o w e v e r , b e c a u s e t h e c l a s s i t s e l f i s
n o t d e c l a r e d p u b l i c , J a v a l o g i c o u t s i d e
* o f t h e < c o d e > o r g . a p a c h e . t o m c a t . s e s s i o n < / c o d e >
p a c k a g e c a n n o t c a s t a n
* H t t p S e s s i o n v i e w o f t h i s i n s t a n c e b a c k t o a S e s s i o n v i e w .
*
* @ a u t h o r C r a i g R . M c C l a n a h a n* @ v e r s i o n $ R e v i s i o n : 1 . 2 $ $ D a t e :
2 0 0 0 / 0 5 / 1 5 1 7 : 5 4 : 1 0 $
* /
f i n a l c l a s s StandardSession
i m p l e m e n t s H t t p S e s s i o n, S e s s i o n {
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - C o n s t r u c t o r s
/ * *
* C o n s t r u c t a n e w S e s s i o n a s s o c i a t e d
w i t h t h e s p e c i f i e d M a n a g e r .*
* @p a r a m m a n a g e r T h e m a n a g e r w i t h
w h i c h t h i s S e s s i o n i s a s s o c i a t e d* /
p u b l i c S t a n d a r d S e s s i o n( M a n a g e r
m a n a g e r ) {
s u p e r ( ) ;
t h i s . m a n a g e r = m a n a g e r ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - I n s t a n c e V a r i a b l e s
/ * ** T h e c o l l e c t i o n o f u s e r d a t a
a t t r i b u t e s a s s o c i a t e d w i t h t h i s S e s s i o n .
* /p r i v a t e Hashtable a t t r i b u t e s = n e w
Hashtable ( ) ;
/ * *
* T h e t i m e t h i s s e s s i o n w a s c r e a t e d , i n m i l l i s e c o n d s s i n c e m i d n i g h t ,
* January 1, 1970 GMT.
* /p r i v a t e l o n g c r e a t i o n T i m e = 0 L ;
/ * *
* T h e s e s s i o n i d e n t i f i e r o f t h i s
S e s s i o n .* /
p r i v a t e S t r i n g i d = n u l l ;
/ * *
* D e s c r i p t i v e i n f o r m a t i o n d e s c r i b i n g t h i s S e s s i o n i m p l e m e n t a t i o n .
* /
p r i v a t e s t a t i c f i n a l S t r i n g i n f o = " S t a n d a r d S e s s i o n / 1 . 0 " ;
/ * *
* The last accessed time for this
S e s s i o n .* /
/ * *
* T h e M a n a g e r w i t h w h i c h t h i s S e s s i o n
i s a s s o c i a t e d .* /
p r i v a t e M a n a g e r m a n a g e r = n u l l ;
/ * *
* T h e m a x i m u m t i m e i n t e r v a l , i n s e c o n d s , b e t w e e n c l i e n t r e q u e s t s b e f o r e
* the s e r v l e t container may
i n v a l i d a t e t h i s s e s s i o n . A n e g a t i v e t i m e* i n d i c a t e s t h a t t h e s e s s i o n s h o u l d
never time out.
* /p r i v a t e i n t m a x I n a c t i v e I n t e r v a l = - 1 ;
/ * *
* F l a g i n d i c a t i n g w h e t h e r t h i s
s e s s i o n i s n e w o r n o t .* /
p r i v a t e b o o l e a n i s N e w = true;
/ * *
* F l a g i n d i c a t i n g w h e t h e r t h i s s e s s i o n i s v a l i d o r n o t .
* /
p r i v a t e b o o l e a n i s V a l i d = f a l s e ;
/ * ** T h e s t r i n g m a n a g e r f o r t h i s
p a c k a g e .
* /p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r .g e t M a n a g e r ( " o r g . a p a c h e . t o m c at . s e s s i o n " ) ;
/ * *
* T h e H T T P s e s s i o n c o n t e x t a s s o c i a t e d
w i t h t h i s s e s s i o n .* /
p r i v a t e s t a t i c H t t p S e s s i o n C o n t e x t
s e s s i o n C o n t e x t = n u l l ;
/ * ** T h e c u r r e n t a c c e s s e d t i m e f o r t h i s
s e s s i o n .
* /p r i v a t e l o n g thisAccessedTime =
c r e a t i o n T i m e ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - S e s s i o n P r o p e r t i e s
/ * *
* S e t t h e c r e a t i o n t i m e f o r t h i s s e s s i o n . T h i s m e t h o d i s c a l l e d b y t h e
* M a n a g e r w h e n a n e x i s t i n g S e s s i o n
i n s t a n c e i s r e u s e d .*
* @p a r a m t i m e T h e n e w c r e a t i o n t i m e
* /public void s e t C r e a t i o n T i m e ( l o n g t i m e )
{
t h i s . c r e a t i o n T i m e = time;
t h i s . t h i s A c c e s s e d T i m e = t i m e ;
}
/ * *
* R e t u r n t h e s e s s i o n i d e n t i f i e r f o r
t h i s s e s s i o n .* /
p u b l i c S t r i n g g e t I d () {
r e t u r n ( t h i s . i d ) ;
}
/ * ** S e t t h e s e s s i o n i d e n t i f i e r f o r t h i s
s e s s i o n .
** @p a r a m i d T h e n e w s e s s i o n
i d e n t i f i e r
* /public void setId ( S t r i n g i d ) {
i f ( ( t h i s . i d ! = n u l l ) & & ( m a n a g e r ! = n u l l ) & &
( m a n a g e r i n s t a n c e o f
M a n a g e r B a s e ) )( (M a n a g e r B a s e )
m a n a g e r ) . r e m o v e ( t h i s ) ;
this.id = id;
i f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e ri n s t a n c e o f M a n a g e r B a s e ) )
( (M a n a g e r B a s e )
m a n a g e r ) . a d d ( t h i s ) ;
}
/ * *
* R e t u r n d e s c r i p t i v e i n f o r m a t i o n a b o u t t h i s S e s s i o n i m p l e m e n t a t i o n a n d
* t h e c o r r e s p o n d i n g v e r s i o n n u m b e r ,
i n t h e f o r m a t*
< c o d e > & lt ; d e s c r i p t i o n & g t ;/& l t ; v e r s i o n &g t ; <
/ c o d e > .* /
p u b l i c S t r i n g g e t I n f o () {
return (this.info);
}
/ * ** R e t u r n t h e M a n a g e r w i t h i n w h i c h
t h i s S e s s i o n i s v a l i d .
* /p u b l i c M a n a g e r g e t M a n a g e r () {
r e t u r n ( t h i s . m a n a g e r ) ;
}
/ * *
* S e t t h e M a n a g e r w i t h i n w h i c h t h i s S e s s i o n i s v a l i d .
*
* @p a r a m m a n a g e r T h e n e w M a n a g e r* /
public void s e t M a n a g e r( M a n a g e r
m a n a g e r ) {
t h i s . m a n a g e r = m a n a g e r ;
}
/ * *
* R e t u r n t h e m a x i m u m t i m e i n t e r v a l ,
i n s e c o n d s , b e t w e e n c l i e n t r e q u e s t s* b e f o r e t h e s e r v l e t c o n t a i n e r w i l l
i n v a l i d a t e t h e s e s s i o n . A n e g a t i v e
* t i m e i n d i c a t e s t h a t t h e s e s s i o n s h o u l d n e v e r t i m e o u t .
*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n
* a n i n v a l i d a t e d s e s s i o n
* /p u b l i c i n t g e t M a x I n a c t i v e I n t e r v a l () {
return (this. m a x I n a c t i v e I n t e r v a l ) ;
}
/ * *
* S e t t h e m a x i m u m t i m e i n t e r v a l , i n s e c o n d s , b e t w e e n c l i e n t r e q u e s t s
* b e f o r e t h e s e r v l e t c o n t a i n e r w i l l
i n v a l i d a t e t h e s e s s i o n . A n e g a t i v e* t i m e i n d i c a t e s t h a t t h e s e s s i o n
s h o u l d n e v e r t i m e o u t .
** @p a r a m i n t e r v a l T h e n e w m a x i m u m
i n t e r v a l
* /public void s e t M a x I n a c t i v e I n t e r v a l( i n t
i n t e r v a l ) {
t h i s . m a x I n a c t i v e I n t e r v a l =
interval;
/ * *
* R e t u r n t h e < c o d e > H t t p S e s s i o n < / c o d e > f o r
w h i c h t h i s o b j e c t* is the facade.
* /
p u b l i c H t t p S e s s i o n g e t S e s s i o n ( ) {
r e t u r n ( ( H t t p S e s s i o n ) t h i s ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - S e s s i o n P u b l i c M e t h o d s
/ * ** P e r f o r m t h e i n t e r n a l p r o c e s s i n g r e q u i r e d t o
i n v a l i d a t e t h i s s e s s i o n ,
* w i t h o u t t r i g g e r i n g a n e x c e p t i o n i f t h e s e s s i o n h a s a l r e a d y e x p i r e d .
* /
p u b l i c v o i d e x p i r e ( ) {
/ / R e m o v e t h i s s e s s i o n f r o m o u r m a n a g e r ' s
a c t i v e s e s s i o n si f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e r
i n s t a n c e o f M a n a g e r B a s e ) )
( (M a n a g e r B a s e ) m a n a g e r ) . r e m o v e ( t h i s ) ;
/ / U n b i n d a n y o b j e c t s a s s o c i a t e d w i t h t h i s
s e s s i o nV e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = g e t A t t r i b u t e N a m e s ( ) ;
w h i l e ( a t t r s . h a s M o r e E l e m e n t s ( ) ) {S t r i n g a t t r = ( S t r i n g )
a t t r s . n e x t E l e m e n t ( ) ;
r e s u l t s . a d d E l e m e n t ( a t t r ) ;}
E n u m e r a t i o n n a m e s = r e s u l t s . e l e m e n t s ( ) ;
w h i l e ( n a m e s . h a s M o r e E l e m e n t s ( ) ) {S t r i n g n a m e = ( S t r i n g )
n a m e s . n e x t E l e m e n t ( ) ;
r e m o v e A t t r i b u t e ( n a m e ) ;}
/ / M a r k t h i s s e s s i o n a s i n v a l i ds e t V a l i d ( f a l s e ) ;
}
/ * ** R e l e a s e a l l o b j e c t r e f e r e n c e s , a n d
i n i t i a l i z e i n s t a n c e v a r i a b l e s , i n
* p r e p a r a t i o n f o r r e u s e o f t h i s o b j e c t .* /
p u b l i c v o i d r e c y c l e ( ) {
/ / R e s e t t h e i n s t a n c e v a r i a b l e s a s s o c i a t e d
w i t h t h i s S e s s i o n
a t t r i b u t e s . c l e a r ( ) ;c r e a t i o n T i m e = 0 L ;
i d = n u l l ;
m a n a g e r = n u l l ;m a x I n a c t i v e I n t e r v a l = - 1;
i s N e w = true;
isValid = f a l s e ;
/ / T e l l o u r M a n a g e r t h a t t h i s S e s s i o n h a s
b e e n r e c y c l e di f ( ( m a n a g e r ! = n u l l ) & & ( m a n a g e r
i n s t a n c e o f M a n a g e r B a s e ) )
( (M a n a g e r B a s e ) m a n a g e r ) . r e c y c l e ( t h i s ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - S e s s i o n P a c k a g e M e t h o d s
/ * ** R e t u r n t h e < c o d e > i s V a l i d < / c o d e > f l a g f o r
t h i s s e s s i o n .
* /b o o l e a n i s V a l i d () {
return (this. i s V a l i d ) ;
}
/ * *
* Set the <code> i s N e w< / c o d e > f l a g f o r t h i s s e s s i o n .
*
* @ p a r a m i s N e w T h e n e w v a l u e f o r t h e < c o d e > i s N e w < / c o d e > f l a g
* /
v o i d s e t N e w ( b o o l e a n i s N e w ) {
this.isNew = isNew;
}
/ * *
* S e t t h e < c o d e > i s V a l i d < / c o d e > f l a g f o r t h i s
s e s s i o n .*
* @ p a r a m i s V a l i d T h e n e w v a l u e f o r t h e
< c o d e > i s V a l i d < / c o d e > f l a g* /
v o i d s e t V a l i d ( b o o l e a n i s V a l i d ) {
t h i s . i s V a l i d = i s V a l i d ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - H t t p S e s s i o n P r o p e r t i e s
/ * ** R e t u r n t h e t i m e w h e n t h i s s e s s i o n w a s
c r e a t e d , i n m i l l i s e c o n d s s i n c e
* m i d n i g h t , J a n u a r y 1 , 1 9 7 0 G M T .*
* @ e x c e p t i o n IllegalStateException i f t h i s
m e t h o d i s c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
* /
public long g e t C r e a t i o n T i m e () {
return (this. creationTime ) ;
}
/ * *
* R e t u r n t h e s e s s i o n c o n t e x t w i t h w h i c h t h i s
s e s s i o n i s a s s o c i a t e d .*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 1 , t h i s m e t h o d
i s d e p r e c a t e d a n d h a s n o* r e p l a c e m e n t . I t w i l l b e r e m o v e d i n a
future version of the
* J a v a S e r v l e t A P I .* /
p u b l i c H t t p S e s s i o n C o n t e x t g e t S e s s i o n C o n t e x t ( )
{
i f ( s e s s i o n C o n t e x t = = n u l l )
s e s s i o n C o n t e x t = n e wS t a n d a r d S e s s i o n C o n t e x t ( ) ;
r e t u r n ( s e s s i o n C o n t e x t ) ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - H t t p S e s s i o n P u b l i c M e t h o d s
/ * *
* R e t u r n t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e i n t h i s s e s s i o n , o r
* < c o d e > n u l l < / c o d e > i f n o o b j e c t i s b o u n d
with that name.*
* @p a r a m n a m e N a m e o f t h e a t t r i b u t e t o b e
r e t u r n e d*
* @ e x c e p t i o n IllegalStateException i f t h i s
m e t h o d i s c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
* /
p u b l i c O b j e c t g e t A t t r i b u t e ( S t r i n g n a m e ) {
r e t u r n ( a t t r i b u t e s . g e t ( n a m e ) ) ;
}
/ * *
* R e t u r n a n < c o d e > E n u m e r a t i o n < / c o d e > o f
< c o d e > S t r i n g < / c o d e > o b j e c t s* c o n t a i n i n g t h e n a m e s o f t h e o b j e c t s b o u n d
t o t h i s s e s s i o n .
** @ e x c e p t i o n IllegalStateException i f t h i s
m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n* /
p u b l i c E n u m e r a t i o n g e t A t t r i b u t e N a m e s ( ) {
r e t u r n ( a t t r i b u t e s . k e y s ( ) ) ;
}
/ * ** R e t u r n t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d
n a m e i n t h i s s e s s i o n , o r
* < c o d e > n u l l < / c o d e > i f n o o b j e c t i s b o u n d with that name.
*
* @p a r a m n a m e N a m e o f t h e v a l u e t o b e r e t u r n e d
*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
** @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d
i s r e p l a c e d b y
* < c o d e >g e t A t t r i b u t e( ) < / c o d e >* /
p u b l i c O b j e c t g e t V a l u e( S t r i n g n a m e ) {
r e t u r n ( g e t A t t r i b u t e ( n a m e ) ) ;
}
/ * ** R e t u r n t h e s e t o f n a m e s o f o b j e c t s b o u n d t o
t h i s s e s s i o n . I f t h e r e
* a r e n o s u c h o b j e c t s , a z e r o - length array is returned.
*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
** @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d
i s r e p l a c e d b y
* < c o d e >g e t A t t r i b u t e N a m e s ()</code>* /
p u b l i c S t r i n g [ ] getValueNames ( ) {
V e c t o r r e s u l t s = n e w V e c t o r ( ) ;
E n u m e r a t i o n a t t r s = getAttributeNames ( ) ;
w h i l e ( a t t r s. h a s M o r e E l e m e n t s ()) {S t r i n g attr = ( S t r i n g )
a t t r s . n e x t E l e m e n t ( ) ;
r e s u l t s .a d d E l e m e n t ( attr) ;}
S t r i n g n a m e s [ ] = n e w
S t r i n g [ r e s u l t s . s i z e ( ) ] ;f o r ( int i = 0 ; i < n a m e s . l e n g t h ; i + + )
n a m e s [ i ] = ( S t r i n g )
r e s u l t s .e l e m e n t A t (i);r e t u r n ( n a m e s ) ;
}
/ * ** I n v a l i d a t e s t h i s s e s s i o n a n d u n b i n d s a n y
o b j e c t s b o u n d t o i t .
** @ e x c e p t i o n IllegalStateException i f t h i s
m e t h o d i s c a l l e d o n
* a n i n v a l i d a t e d s e s s i o n* /
p u b l i c v o i d i n v a l i d a t e ( ) {
// Cause this session to expire
e x p i r e ( ) ;
}
/ * *
* R e t u r n < c o d e > t r u e < / c o d e > i f t h e c l i e n t d o e s
n o t y e t k n o w a b o u t t h e* s e s s i o n , o r i f t h e c l i e n t c h o o s e s n o t t o
j o i n t h e s e s s i o n . F o r
* e x a m p l e , i f t h e s e r v e r u s e d o n l y c o o k i e -b a s e d s e s s i o n s , a n d t h e c l i e n t
* h a s d i s a b l e d t h e u s e o f c o o k i e s , t h e n a
s e s s i o n w o u l d b e n e w o n e a c h* request.
*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
* /p u b l i c b o o l e a n i s N e w () {
return (this. i s N e w) ;
}
/ * ** B i n d a n o b j e c t t o t h i s s e s s i o n , u s i n g t h e s p e c i f i e d n a m e . I f a n o b j e c t
* o f t h e s a m e n a m e i s a l r e a d y b o u n d t o t h i s s e s s i o n , t h e o b j e c t i s
* r e p l a c e d .* <p>
* After this method executes, and if the object implements
* < c o d e > H t t p S e s s i o n B i n d i n g L i s t e n e r < / c o d e > , t h e c o n t a i n e r c a l l s* < c o d e > v a l u e B o u n d ( ) < / c o d e > o n t h e o b j e c t .
*
* @ p a r a m n a m e N a m e t o w h i c h t h e o b j e c t i s b o u n d , c a n n o t b e n u l l* @ p a r a m v a l u e O b j e c t t o b e b o u n d , c a n n o t b e n u l l
*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
*
* @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d i s r e p l a c e d b y* < c o d e >s e t A t t r i b u t e( ) < / c o d e >
* /
public void p u t V a l u e ( S t r i n g n a m e , O b j e c t v a l u e ) {
s e t A t t r i b u t e( n a m e , v a l u e ) ;
}
/ * *
* R e m o v e t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e f r o m t h i s s e s s i o n . I f
* t h e s e s s i o n d o e s n o t h a v e a n o b j e c t b o u n d w i t h t h i s n a m e , t h i s m e t h o d* d o e s n o t h i n g .
* <p>
* After this method executes, and if the object implements* < c o d e > HttpSessionBindingListener < / c o d e > , t h e c o n t a i n e r c a l l s
* < c o d e > v a l u e U n b o u n d ( ) < / c o d e > o n t h e o b j e c t .
** @p a r a m n a m e N a m e o f t h e o b j e c t t o r e m o v e f r o m t h i s s e s s i o n .
*
* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n* i n v a l i d a t e d s e s s i o n
* /
public void r e m o v e A t t r i b u t e (String name) {
s y n c h r o n i z e d ( a t t r i b u t e s ) {
O b j e c t o b j e c t = a t t r i b u t e s . g e t ( n a m e ) ;i f ( o b j e c t = = n u l l )
r e t u r n ;
a t t r i b u t e s . r e m o v e ( n a m e ) ;/ / S y s t e m . o u t . p r i n t l n( " R e m o v i n g a t t r i b u t e " + n a m e ) ;
if (object i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r ) {
( ( H t t p S e s s i o n B i n d i n g L i s t e n e r) o b j e c t ) . v a l u e U n b o u n d( n e w H t t p S e s s i o n B i n d i n g E v e n t ( (H t t p S e s s i o n ) this, name));
}
}
}
/ * *
* R e m o v e t h e o b j e c t b o u n d w i t h t h e s p e c i f i e d n a m e f r o m t h i s s e s s i o n . I f* t h e s e s s i o n d o e s n o t h a v e a n o b j e c t b o u n d w i t h t h i s n a m e , t h i s m e t h o d
* d o e s n o t h i n g .
* <p>* After this method executes, and if the object implements
* < c o d e > HttpSessionBindingListener < / c o d e > , t h e c o n t a i n e r c a l l s
* < c o d e > v a l u e U n b o u n d ( ) < / c o d e > o n t h e o b j e c t .*
* @p a r a m n a m e N a m e o f t h e o b j e c t t o r e m o v e f r o m t h i s s e s s i o n .
** @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
** @ d e p r e c a t e d A s o f V e r s i o n 2 . 2 , t h i s m e t h o d i s r e p l a c e d b y
* < c o d e >r e m o v e A t t r i b u t e ( ) < / c o d e >
* /public void removeValue ( S t r i n g n a m e ) {
r e m o v e A t t r i b u t e ( n a m e ) ;
}
/ * *
* B i n d a n o b j e c t t o t h i s s e s s i o n , u s i n g t h e s p e c i f i e d n a m e . I f a n o b j e c t* o f t h e s a m e n a m e i s a l r e a d y b o u n d t o t h i s s e s s i o n , t h e o b j e c t i s
* r e p l a c e d .
* <p>* After this method executes, and if the object implements
* < c o d e > H t t p S e s s i o n B i n d i n g L i s t e n e r < / c o d e > , t h e c o n t a i n e r c a l l s
* < c o d e > v a l u e B o u n d ( ) < / c o d e > o n t h e o b j e c t .*
* @ p a r a m n a m e N a m e t o w h i c h t h e o b j e c t i s b o u n d , c a n n o t b e n u l l
* @ p a r a m v a l u e O b j e c t t o b e b o u n d , c a n n o t b e n u l l*
* @ e x c e p t i o n I l l e g a l A r g u m e n t E x c e p t i o n i f a n a t t e m p t i s m a d e t o a d d a
* n o n - s e r i a l i z a b l e o b j e c t i n a n e n v i r o n m e n t m a r k e d d i s t r i b u t a b l e .* @ e x c e p t i o n IllegalStateException i f t h i s m e t h o d i s c a l l e d o n a n
* i n v a l i d a t e d s e s s i o n
* /public void s e t A t t r i b u t e ( S t r i n g n a m e , O b j e c t v a l u e ) {
i f ( ( m a n a g e r ! = n u l l ) & & m a n a g e r . getDistributable ( ) & &! ( v a l u e i n s t a n c e o f S e r i a l i z a b l e ) )
throw new I l l e g a l A r g u m e n t E x c e p t i o n
( s m .g e t S t r i n g ( " s t a n d a r d S e s s i o n . s e t A t t r i b u t e . iae " ) ) ;
s y n c h r o n i z e d ( a t t r i b u t e s ) {
removeAttribute ( n a m e ) ;a t t r i b u t e s . p u t ( n a m e , v a l u e ) ;
if (value i n s t a n c e o f H t t p S e s s i o n B i n d i n g L i s t e n e r )
( ( H t t p S e s s i o n B i n d i n g L i s t e n e r) v a l u e ) . valueBound( n e w H t t p S e s s i o n B i n d i n g E v e n t ( (H t t p S e s s i o n ) this, name));
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HttpSession P r i v a t e M e t h o d s
/ * *
* R e a d a s e r i a l i z e d v e r s i o n o f t h i s s e s s i o n o b j e c t f r o m t h e s p e c i f i e d
* o b j e c t i n p u t s t r e a m .* <p>
* < b > I M P L E M E N T A T I O N N O T E < / b > : T h e r e f e r e n c e t o t h e o w n i n g M a n a g e r
* i s n o t r e s t o r e d b y t h i s m e t h o d , a n d m u s t b e s e t e x p l i c i t l y .*
* @p a r a m s t r e a m T h e i n p u t s t r e a m t o r e a d f r o m
** @ e x c e p t i o n C l a s s N o t F o u n d E x c e p t i o n i f a n u n k n o w n c l a s s i s s p e c i f i e d
* @ e x c e p t i o n I O E x c e p t i o n i f a n i n p u t / o u t p u t e r r o r o c c u r s
* /p r i v a t e v o i d readObject ( ObjectInputStream s t r e a m )
t h r o w s C l a s s N o t F o u n d E x c e p t i o n , I O E x c e p t i o n {
/ / D e s e r i a l i z e t h e s c a l a r i n s t a n c e v a r i a b l e s ( e x c e p t M a n ager)
c r e a t i o n T i m e = ( ( L o n g ) s t r e a m . r e a d O b j e c t ( ) ) . l o n g V a l u e ( ) ;
i d = ( S t r i n g ) s t r e a m . r e a d O b j e c t ( ) ;i s V a l i d = ( ( B o o l e a n ) s t r e a m . r e a d O b j e c t ( ) ) . b o o l e a n V a l u e ( ) ;
/ / D e s e r i a l i z e t h e a t t r i b u t e c o u n t a n d a t t r i b u t e v a l u e si n t n = ( ( I n t e g e r ) s t r e a m . r e a d O b j e c t ( ) ) . i n t V a l u e ( ) ;
f o r ( i n t i = 0 ; i < n ; i + + ) {
S t r i n g n a m e = ( S t r i n g ) s t r e a m . r e a d O b j e c t ( ) ;O b j e c t v a l u e = ( O b j e c t ) s t r e a m . r e a d O b j e c t ( ) ;
a t t r i b u t e s . p u t ( n a m e , v a l u e ) ;
}
}
/ * *
* W r i t e a s e r i a l i z e d v e r s i o n o f t h i s s e s s i o n o b j e c t t o t h e s p e c i f i e d* o b j e c t o u t p u t s t r e a m .
* <p>
* < b > I M P L E M E N T A T I O N N O T E < / b > : T h e o w n i n g M a n a g e r w i l l n o t b e s t o r e d* i n t h e s e r i a l i z e d r e p r e s e n t a t i o n o f t h i s S e s s i o n . A f t e r c a l l i n g
* < c o d e > r e a d O b j e c t ( ) < / c o d e > , y o u m u s t s e t t h e a s s o c i a t e d M a n a g e r
* e x p l i c i t l y .* <p>
* < b > I M P L E M E N T A T I O N N O T E < / b > : A n y a t t r i b u t e t h a t i s n o t S e r i a l i z a b l e
* w i l l b e s i l e n t l y i g n o r e d . I f y o u d o n o t w a n t a n y s u c h a t t r i b u t e s ,* b e s u r e t h e < c o d e > d i s t r i b u t a b l e < / c o d e > p r o p e r t y o f o u r a s s o c i a t e d
* M a n a g e r i s s e t t o < c o d e > t r u e < / c o d e > .
** @p a r a m s t r e a m T h e o u t p u t s t r e a m t o w r i t e t o
*
* @ e x c e p t i o n I O E x c e p t i o n i f a n i n p u t / o u t p u t e r r o r o c c u r s* /
p r i v a t e v o i d w r i t e O b j e c t ( O b j e c t O u t p u t S t r e a m s t r e a m ) t h r o w s I O E x c e p t i o n {
/ / W r i t e t h e s c a l a r i n s t a n c e v a r i a b l e s ( e x c e p t M a n a g e r )
stream. w r i t e O b j e c t( n e w L o n g ( c r e a t i o n T i m e ));
stream. w r i t e O b j e c t( i d ) ;s t r e a m . w r i t e O b j e c t ( n e w I n t e g e r ( m a x I n a c t i v e I n t e r v a l) ) ;
stream. w r i t e O b j e c t(new Boolean( i s N e w) ) ;
stream. w r i t e O b j e c t(new Boolean( i s V a l i d ) ) ;
/ / A c c u m u l a t e t h e n a m e s o f s e r i a l i z a b l e a t t r i b u t e s
V e c t o r r e s u l t s = n e w V e c t o r ( ) ;E n u m e r a t i o n a t t r s = getAttributeNames ( ) ;
w h i l e ( a t t r s. h a s M o r e E l e m e n t s ()) {
S t r i n g attr = ( S t r i n g ) a t t r s . n e x t E l e m e n t ( ) ;O b j e c t v a l u e = a t t r i b u t e s . g e t ( attr) ;
if (value instanceof Serializable )
r e s u l t s . a d d E l e m e n t ( attr ) ;}
/ / S e r i a l i z e t h e a t t r i b u t e c o u n t a n d t h e a t t r i b u t e v a l u e sstream. w r i t e O b j e c t( n e w I n t e g e r ( r e s u l t s . s i z e ( ) ) ) ;
E n u m e r a t i o n n a m e s = r e s u l t s . e l e m e n t s ( ) ;
w h i l e ( n a m e s . h a s M o r e E l e m e n t s ()) {S t r i n g n a m e = ( S t r i n g ) n a m e s . n e x t E l e m e n t ( ) ;
s t r e a m . w r i t e O b j e c t ( n a m e ) ;
s t r e a m . w r i t e O b j e c t ( a t t r i b u t e s . g e t ( n a m e ) ) ;}
}
c r o s s c u t i n v a l i d a t e ( StandardSession s ) : s & ( int getMaxInactiveInterval ( ) | long getCreationTime ( ) |
O b j e c t g e t A t t r i b u t e( S t r i n g ) |
E n u m e r a t i o n g e t A t t r i b u t e N a m e s () |String[] g e t V a l u e N a m e s () |
v o i d i n v a l i d a t e ( ) |
b o o l e a n i s N e w( ) |void removeAttribute ( S t r i n g ) |
void s e t A t t r i b u t e (String,
Object));
s t a t i c a d v i c e ( StandardSession s ) : i n v a l i d a t e ( s ) {
b e f o r e {i f ( ! s . i s V a l i d( ) )
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n
( s . s m .g e t S t r i n g ( " s t a n d a r d S e s s i o n . " + thisJoinPoint . m e t h o d N a m e
+ " . i s e "));
}}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P r i v a t e C l a s s
/ * ** T h i s c l a s s i s a d u m m y i m p l e m e n t a t i o n o f t h e < c o d e > H t t p S e s s i o n C o n t e x t < / c o d e >
* i n t e r f a c e , t o c o n f o r m t o t h e r e q u i r e m e n t t h a t s u c h a n o b j e c t be returned
* w h e n < c o d e >H t t p S e s s i o n .g e t S e s s i o n C o n t e x t ()</code> is called.*
* @ a u t h o r C r a i g R . M c C l a n a h a n
** @ d e p r e c a t e d A s o f J a v a Servlet A P I 2 . 1 w i t h n o r e p l a c e m e n t . T h e
* i n t e r f a c e w i l l b e r e m o v e d i n a f u t u r e v e r s i o n o f t h i s A P I .
* /
f i n a l c l a s s S t a n d a r d S e s s i o n C o n t e x t implements H t t p S e s s i o n C o n t e x t {
p r i v a t e V e c t o r d u m m y = n e w V e c t o r ( ) ;
/ * *
* R e t u r n t h e s e s s i o n i d e n t i f i e r s o f a l l s e s s i o n s d e f i n e d
* w i t h i n t h i s c o n t e x t .*
* @ d e p r e c a t e d A s o f J a v a S e r v l e t A P I 2 . 1 w i t h n o r e p l a c e m e n t .
* T h i s m e t h o d m u s t r e t u r n a n e m p t y < c o d e > E n u m e r a t i o n < / c o d e >* a n d w i l l b e r e m o v e d i n a f u t u r e v e r s i o n o f t h e A P I .
* /
p u b l i c E n u m e r a t i o n g e t I d s () {
r e t u r n ( d u m m y . e l e m e n t s ( ) ) ;
}
/ * *
* R e t u r n t h e < c o d e > H t t p S e s s i o n < / c o d e > a s s o c i a t e d w i t h t h e
* s p e c i f i e d s e s s i o n i d e n t i f i e r .*
* @p a r a m i d S e s s i o n i d e n t i f i e r f o r w h i c h t o l o o k u p a s e s s i o n
** @ d e p r e c a t e d A s o f J a v a S e r v l e t A P I 2 . 1 w i t h n o r e p l a c e m e n t .
* T h i s m e t h o d m u s t r e t u r n n u l l a n d w i l l b e r e m o v e d i n a
* f u t u r e v e r s i o n o f t h e A P I .* /
p u b l i c HttpSession getSession ( S t r i n g i d ) {
r e t u r n ( n u l l ) ;
}
}
StandardSession
p a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t j a v a . i o . I O E x c e p t i o n ;
i m p o r t j a v a . u t i l . E n u m e r a t i o n ;i m p o r t j a v a . u t i l . H a s h t a b l e ;
i m p o r t j a v a . u t i l . V e c t o r ;
i m p o r t o r g . a p a c h e . t o m c a t . c a t a l i n a . * ;i m p o r t j a v a x . s e r v l e t . h t t p . C o o k i e ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;i m p o r t o r g . w 3 c . d o m . N a m e d N o d e M a p ;
i m p o r t o r g . w 3 c . d o m . N o d e ;
/ * *
* S t a n d a r d i m p l e m e n t a t i o n o f t h e < b > M a n a g e r < / b > i n t e r f a c e t h a t p r o v i d e s* n o s e s s i o n p e r s i s t e n c e o r d i s t r i b u t a b l e c a p a b i l i t i e s , b u t d o e s s u p p o r t
* a n o p t i o n a l , c o n f i g u r a b l e , m a x i m u m n u m b e r o f a c t i v e s e s s i o n s a l l o w e d .
* < p >* L i f e c y c l e c o n f i g u r a t i o n o f t h i s c o m p o n e n t a s s u m e s a n X M L n o d e
* i n t h e f o l l o w i n g f o r m a t :
* <code>* &l t ; M a n a g e r className= " o r g . a p a c h e . t o m c a t . s e s s i o n .S t a n d a r d M a n a g e r "
* c h e c k I n t e r v a l = " 6 0 " m a x A c t i v e S e s s i o n s = " - 1"
* m a x I n a c t i v e I n t e r v a l = " -1 " / >* < / c o d e >
* w h e r e y o u c a n a d j u s t t h e f o l l o w i n g p a r a m e t e r s , w i t h d e f a u l t v alues
* i n s q u a r e b r a c k e t s :* < u l >
* < l i ><b>c h e c k I n t e r v a l </b> - T h e i n t e r v a l ( i n s e c o n d s ) b e t w e e n b a c k g r o u n d
* t h r e a d c h e c k s f o r e x p i r e d s e s s i o n s . [ 6 0 ]* < l i ><b>maxActiveSessions < / b > - T h e m a x i m u m n u m b e r o f s e s s i o n s a l l o w e d t o
* b e a c t i v e a t o n c e , o r - 1 f o r n o l i m i t . [ - 1]
* < l i ><b>m a x I n a c t i v e I n t e r v a l </b> - T h e d e f a u l t m a x i m u m n u m b e r o f s e c o n d s o f* i n a c t i v i t y b e f o r e w h i c h t h e s e r v l e t container is allowed to time out
* a session, or - 1 f o r n o l i m i t . T h i s v a l u e s h o u l d b e o v e r r i d d e n f r o m
* t h e d e f a u l t s e s s i o n t i m e o u t s p e c i f i e d i n t h e w e b a p p l i c a t i o n d e p l o y m e n t* d e s c r i p t o r , i f a n y . [ - 1 ]
* < / u l >
** @ a u t h o r C r a i g R . M c C l a n a h a n
* @ v e r s i o n $ R e v i s i o n : 1 . 1 . 1 . 1 $ $ D a t e : 2 0 0 0 / 0 5 / 0 2 2 1 : 2 8 : 3 0 $
* /
p u b l i c f i n a l c l a s s S t a n d a r d M a n a g e r
e x t e n d s M a n a g e r B a s ei m p l e m e n t s L i f e c y c l e , R u n n a b l e {
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - I n s t a n c e V a r i a b l e s
/ * *
* T h e i n t e r v a l ( i n s e c o n d s ) b e t w e e n c h e c k s f o r e x p i r e d s e s s ions.
* /p r i v a t e i n t c h e c k I n t e r v a l = 6 0 ;
/ * *
* H a s t h i s c o m p o n e n t b e e n c o n f i g u r e d y e t ?
* /p r i v a t e b o o l e a n configured = false;
/ * *
* T h e d e s c r i p t i v e i n f o r m a t i o n a b o u t t h i s i m p l e m e n t a t i o n .
* /p r i v a t e s t a t i c f i n a l S t r i n g i n f o = " S t a n d a r d M a n a g e r / 1 . 0 " ;
/ * *
* T h e m a x i m u m n u m b e r o f a c t i v e S e s s i o n s a l l o w e d , o r - 1 f o r n o l i m i t .
* /p r o t e c t e d i n t m a x A c t i v e S e s s i o n s = - 1 ;
/ * *
* T h e s t r i n g m a n a g e r f o r t h i s p a c k a g e .
* /p r i v a t e S t r i n g M a n a g e r s m =
S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;
/ * *
* H a s t h i s c o m p o n e n t b e e n s t a r t e d y e t ?* /
p r i v a t e b o o l e a n s t a r t e d = f a l s e ;
/ * *
* T h e b a c k g r o u n d t h r e a d .* /
p r i v a t e T h r e a d t h r e a d = n u l l ;
/ * *
* T h e b a c k g r o u n d t h r e a d c o m p l e t i o n s e m a p h o r e .* /
p r i v a t e b o o l e a n t h r e a d D o n e = false;
/ * *
* N a m e t o r e g i s t e r f o r t h e b a c k g r o u n d t h r e a d .* /
p r i v a t e S t r i n g t h r e a d N a m e = " S t a n d a r d M a n a g e r " ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P r o p e r t i e s
/ * *
* R e t u r n t h e c h e c k i n t e r v a l ( i n s e c o n d s ) f o r t h i s M a n a g e r .* /
p u b l i c i n t g e t C h e c k I n t e r v a l () {
return (this. c h e c k I n t e r v a l ) ;
}
/ * ** S e t t h e c h e c k i n t e r v a l ( i n s e c o n d s ) f o r t h i s M a n a g e r .
*
* @p a r a m c h e c k I n t e r v a l T h e n e w c h e c k i n t e r v a l* /
public void s e t C h e c k I n t e r v a l( i n t c h e c k I n t e r v a l) {
t h i s . c h e c k I n t e r v a l = c h e c k I n t e r v a l ;
}
/ * ** R e t u r n d e s c r i p t i v e i n f o r m a t i o n a b o u t t h i s M a n a g e r i m p l e m e ntation and
* t h e c o r r e s p o n d i n g v e r s i o n n u m b e r , i n t h e f o r m a t
* < c o d e > &l t ; d e s c r i p t i o n & g t ;/&l t ;version& g t ; < / c o d e > .* /
p u b l i c S t r i n g g e t I n f o () {
return (this.info);
}
/ * ** R e t u r n t h e m a x i m u m n u m b e r o f a c t i v e S e s s i o n s a l l o w e d , o r - 1 for
* no limit.
* /p u b l i c i n t g e t M a x A c t i v e S e s s i o n s () {
return (this. m a x A c t i v e S e s s i o n s) ;
}
/ * *
* S e t t h e m a x i m u m n u m b e r o f a c t i v e s S e s s i o n s a l l o w e d , o r - 1 f o r* no limit.
*
* @p a r a m m a x T h e n e w m a x i m u m n u m b e r o f s e s s i o n s* /
public void s e t M a x A c t i v e S e s s i o n s ( int m a x ) {
t h i s . m a x A c t i v e S e s s i o n s = m a x ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - P u b l i c M e t h o d s
/ * ** C o n s t r u c t a n d r e t u r n a n e w s e s s i o n o b j e c t , b a s e d o n t h e d e f a u l t
* s e t t i n g s s p e c i f i e d b y t h i s M a n a g e r ' s p r o p e r t i e s . T h e s e s s i o n
* i d w i l l b e a s s i g n e d b y t h i s m e t h o d , a n d a v a i l a b l e v i a t h e g e t I d ( )* m e t h o d o f t h e r e t u r n e d s e s s i o n . I f a n e w s e s s i o n c a n n o t b e c r e a t e d
* f o r a n y r e a s o n , r e t u r n < c o d e > n u l l < / c o d e > .
** @ e x c e p t i o n IllegalStateException i f a n e w s e s s i o n c a n n o t b e
* i n s t a n t i a t e d f o r a n y r e a s o n
* /p u b l i c S e s s i o n c r e a t e S e s s i o n( ) {
i f ( ( m a x A c t i v e S e s s i o n s >= 0) &&( s e s s i o n s . s i z e ( ) > = m a x A c t i v e S e s s i o n s ) )
throw new I l l e g a l S t a t e E x c e p t i o n
( s m .g e t S t r i n g ( " s t a n d a r d M a n a g e r . c r e a t e S e s s i o n . ise" ) ) ;
r e t u r n ( s u p e r . c r e a t e S e s s i o n ());
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
L i f e c y c l e M e t h o d s
/ * *
* C o n f i g u r e t h i s c o m p o n e n t , b a s e d o n t h e s p e c i f i e d c o n f i g u r a t i o n
* p a r a m e t e r s . T h i s m e t h o d s h o u l d b e c a l l e d i m m e d i a t e l y a f t e r
t h e* c o m p o n e n t i n s t a n c e i s c r e a t e d , a n d b e f o r e
< c o d e > s t a r t ( ) < / c o d e >
* i s c a l l e d .*
* @ p a r a m p a r a m e t e r s C o n f i g u r a t i o n p a r a m e t e r s f o r t h i s
component* ( < B > F I X M E : W h a t o b j e c t t y p e s h o u l d t h i s r e a l l y b e ? )
*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s a l r e a d y b e e n
* c o n f i g u r e d a n d / o r s t a r t e d
* @ e x c e p t i o n L i f e c y c l e E x c e p t i o n i f t h i s c o m p o n e n t d e t e c t s af a t a l e r r o r
* i n t h e c o n f i g u r a t i o n p a r a m e t e r s i t w a s g i v e n
* /p u b l i c v o i d c o n f i g u r e ( N o d e p a r a m e t e r s )
t h r o w s L i f e c y c l e E x c e p t i o n {
/ / V a l i d a t e a n d u p d a t e o u r c u r r e n t c o m p o n e n t s t a t e
i f ( c o n f i g u r e d )
t h r o w n e w L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . a l r e a d y C o n f i g u r e d " ) ) ;
c o n f i g u r e d = t r u e ;i f ( p a r a m e t e r s = = n u l l )
r e t u r n ;
/ / P a r s e a n d p r o c e s s o u r c o n f i g u r a t i o n p a r a m e t e r s
i f ( ! ( " M a n a g e r " . e q u a l s ( p a r a m e t e r s . g e t N o d e N a m e ( ) ) ) )
r e t u r n ;N a m e d N o d e M a p a t t r i b u t e s = p a r a m e t e r s . g e t A t t r i b u t e s ( ) ;
N o d e n o d e = n u l l ;
n o d e = a t t r i b u t e s . g e t N a m e d I t e m ( " c h e c k I n t e r v a l " ) ;
i f ( n o d e ! = n u l l ) {
try {
s e t C h e c k I n t e r v a l ( I n t e g e r . p a r s e I n t ( n o d e . g e t N o d e V a l u e ( ) ) ) ;
} c a t c h ( T h r o w a b l e t ) {; / / X X X - T h r o w e x c e p t i o n ?
}
}
n o d e = a t t r i b u t e s . g e t N a m e d I t e m ( " m a x A c t i v e S e s s i o n s " ) ;
i f ( n o d e ! = n u l l ) {try {
s e t M a x A c t i v e S e s s i o n s ( I n t e g e r . p a r s e I n t ( n o d e . g e t N o d e V a l u e ( ) ) ) ;} c a t c h ( T h r o w a b l e t ) {
; / / X X X - T h r o w e x c e p t i o n ?
}}
n o d e = a t t r i b u t e s . g e t N a m e d I t e m ( " m a x I n a c t i v e I n t e r v a l " ) ;i f ( n o d e ! = n u l l ) {
try {
s e t M a x I n a c t i v e I n t e r v a l ( I n t e g e r . p a r s e I n t ( n o d e . g e t N o d e V a l u e ( ) ) ) ;
} c a t c h ( T h r o w a b l e t ) {
; / / X X X - T h r o w e x c e p t i o n ?}
}
}
/ * ** P r e p a r e f o r t h e b e g i n n i n g o f a c t i v e u s e o f t h e p u b l i c
m e t h o d s o f t h i s
* c o m p o n e n t . T h i s m e t h o d s h o u l d b e c a l l e d a f t e r < c o d e > c o n f i g u r e ( ) < / c o d e > ,
* a n d b e f o r e a n y o f t h e p u b l i c m e t h o d s o f t h e c o m p o n e n t a r e
utilized.*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s n o t
y e t b e e n* c o n f i g u r e d ( i f r e q u i r e d f o r t h i s c o m p o n e n t )
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s
a l r e a d y b e e n* started
* @ e x c e p t i o n L i f e c y c l e E x c e p t i o n i f t h i s c o m p o n e n t d e t e c t s a
f a t a l e r r o r* t h a t p r e v e n t s t h i s c o m p o n e n t f r o m b e i n g u s e d
* /
p u b l i c v o i d s t a r t ( ) t h r o w s L i f e c y c l e E x c e p t i o n {
/ / V a l i d a t e a n d u p d a t e o u r c u r r e n t c o m p o n e n t s t a t e
i f ( ! c o n f i g u r e d )t h r o w n e w L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . n o t C o n f i g u r e d " ) ) ;
i f ( s t a r t e d )t h r o w n e w L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . a l r e a d y S t a r t e d " ) ) ;
s t a r t e d = t r u e ;
/ / S t a r t t h e b a c k g r o u n d r e a p e r t h r e a d
t h r e a d S t a r t ( ) ;
}
/ * *
* G r a c e f u l l y t e r m i n a t e t h e a c t i v e u s e o f t h e p u b l i c m e t h o d s o f t h i s
* c o m p o n e n t . T h i s m e t h o d s h o u l d b e t h e l a s t o n e c a l l e d o n a
g i v e n* i n s t a n c e o f t h i s c o m p o n e n t .
*
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s n o t b e e n s t a r t e d
* @ e x c e p t i o n I l l e g a l S t a t e E x c e p t i o n i f t h i s c o m p o n e n t h a s
a l r e a d y* b e e n s t o p p e d
* @ e x c e p t i o n L i f e c y c l e E x c e p t i o n i f t h i s c o m p o n e n t d e t e c t s a
f a t a l e r r o r* that needs to be reported
* /
p u b l i c v o i d s t o p ( ) t h r o w s L i f e c y c l e E x c e p t i o n {
/ / V a l i d a t e a n d u p d a t e o u r c u r r e n t c o m p o n e n t s t a t e
if (!started)t h r o w n e w L i f e c y c l e E x c e p t i o n
( s m . g e t S t r i n g ( " s t a n d a r d M a n a g e r . n o t S t a r t e d " ) ) ;
s t a r t e d = f a l s e ;
/ / S t o p t h e b a c k g r o u n d r e a p e r t h r e a d
threadStop();
/ / E x p i r e a l l a c t i v e s e s s i o n s
S e s s i o n s e s s i o n s [ ] = f i n d S e s s i o n s ( ) ;f o r ( i n t i = 0 ; i < s e s s i o n s . l e n g t h ; i + + ) {
S t a n d a r d S e s s i o n s e s s i o n = ( S t a n d a r d S e s s i o n )
s e s s i o n s [ i ] ;i f ( ! s e s s i o n . i s V a l i d ( ) )
c o n t i n u e ;
s e s s i o n . e x p i r e ( ) ;}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -P r i v a t e M e t h o d s
/ * *
* S l e e p f o r t h e d u r a t i o n s p e c i f i e d b y t h e < c o d e > c h e c k I n t e r v a l < / c o d e >
* p r o p e r t y .
* /p r i v a t e v o i d t h r e a d S l e e p ( ) {
t r y {T h r e a d . s l e e p ( c h e c k I n t e r v a l * 1 0 0 0 L ) ;
} c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {
;}
}
/ * ** S t a r t t h e b a c k g r o u n d t h r e a d t h a t w i l l p e r i o d i c a l l y c h e c k f o r
* s e s s i o n t i m e o u t s .
* /p r i v a t e v o i d t h r e a d S t a r t ( ) {
if (thread != null)r e t u r n ;
threadDone = false;t h r e a d = n e w T h r e a d ( t h i s , t h r e a d N a m e ) ;
t h r e a d . s e t D a e m o n ( t r u e ) ;
t h r e a d . s t a r t ( ) ;
}
/ * *
* S t o p t h e b a c k g r o u n d t h r e a d t h a t i s p e r i o d i c a l l y c h e c k i n g f o r* s e s s i o n t i m e o u t s .
* /
p r i v a t e v o i d t h r e a d S t o p ( ) {
if (thread == null)
r e t u r n ;
t h r e a d D o n e = t r u e ;
t h r e a d . i n t e r r u p t ( ) ;t r y {
t h r e a d . j o i n ( ) ;
} c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {;
}
t h r e a d = n u l l ;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -B a c k g r o u n d T h r e a d
/ * *
* T h e b a c k g r o u n d t h r e a d t h a t c h e c k s f o r s e s s i o n t i m e o u t s a n d
shutdown.* /
p u b l i c v o i d r u n ( ) {
/ / L o o p u n t i l t h e t e r m i n a t i o n s e m a p h o r e i s s e t
w h i l e ( ! t h r e a d D o n e ) {
t h r e a d S l e e p ( ) ;p r o c e s s E x p i r e s ( ) ;
}
}
StandardManager
StandardSessionManagerp a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t j a v a . i o . I O E x c e p t i o n ;
i m p o r t j a v a x . s e r v l e t . h t t p . C o o k i e ;
i m p o r t j a v a x . s e r v l e t . h t t p . H t t p S e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . c a t a l i n a . * ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . C o n t e x t ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . R e q u e s t ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . R e s p o n s e ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . S e s s i o n M a n a g e r ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S e s s i o n U t i l ;
/ * *
* S p e c i a l i z e d i m p l e m e n t a t i o n o f o r g . a p a c h e . t o m c a t . c o r e . S e s s i o n M a n a g e r
* t h a t a d a p t s t o t h e n e w c o m p o n e n t - b a s e d M a n a g e r
i m p l e m e n t a t i o n .
* < p >
* X X X - A t p r e s e n t , u s e o f < c o d e > S t a n d a r d M a n a g e r < / c o d e > i s h a r d c o d e d ,
* a n d l i f e c y c l e c o n f i g u r a t i o n i s n o t s u p p o r t e d .
* < p >
* < b > I M P L E M E N T A T I O N N O T E < / b > : O n c e w e c o m m i t t o t h e n e w M a n a g e r / S e s s i o n
* p a r a d i g m , I w o u l d s u g g e s t m o v i n g t h e l o g i c i m p l e m e n t e d
h e r e b a c k i n t o
* t h e c o r e l e v e l . T h e T o m c a t . N e x t " M a n a g e r " i n t e r f a c e
a c t s m o r e l i k e a
* c o l l e c t i o n c l a s s , a n d h a s m i n i m a l k n o w l e d g e o f t h e
d e t a i l e d r e q u e s t
* p r o c e s s i n g s e m a n t i c s o f h a n d l i n g s e s s i o n s .
* < p >
* X X X - A t p r e s e n t , t h e r e i s n o w a y ( v i a t h e
S e s s i o n M a n a g e r i n t e r f a c e ) f o r
* a C o n t e x t t o t e l l t h e M a n a g e r t h a t w e c r e a t e w h a t t h e d e f a u l t s e s s i o n
* t i m e o u t f o r t h i s w e b a p p l i c a t i o n ( s p e c i f i e d i n t h e d e p l o y m e n t d e s c r i p t o r )
* s h o u l d b e .
*
* @ a u t h o r C r a i g R . M c C l a n a h a n
* /
p u b l i c f i n a l c l a s s S t a n d a r d S e s s i o n M a n a g e r
i m p l e m e n t s S e s s i o n M a n a g e r {
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - C o n s t r u c t o r s
/ * *
* C r e a t e a n e w S e s s i o n M a n a g e r t h a t a d a p t s t o t h e
c o r r e s p o n d i n g M a n a g e r
* i m p l e m e n t a t i o n .
* /
p u b l i c StandardSessionManager ( ) {
manager = new S t a n d a r d M a n a g e r ();
i f ( m a n a g e r i n s t a n c e o f L i f e c y c l e ) {
try {
( ( L i f e c y c l e ) m a n a g e r ) . c o n f i g u r e ( n u l l ) ;
( ( L i f e c y c l e ) m a n a g e r ) . s t a r t ( ) ;
} c a t c h ( LifecycleException e ) {
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( " " + e ) ;
}
}
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- I n s t a n c e V a r i a b l e s
/ * *
* T h e M a n a g e r i m p l e m e n t a t i o n w e a r e a c t u a l l y u s i n g .
* /
p r i v a t e M a n a g e r m a n a g e r = n u l l ;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- P u b l i c M e t h o d s
/ / X X X s h o u l d w e t h r o w e x c e p t i o n o r j u s t r e t u r n n u l l ? ?
p u b l i c H t t p S e s s i o n f i n d S e s s i o n ( C o n t e x t c t x , S t r i n g i d
) {
t r y {
S e s s i o n s e s s i o n = m a n a g e r . f i n d S e s s i o n ( i d ) ;
i f ( s e s s i o n ! = n u l l )
r e t u r n s e s s i o n . g e t S e s s i o n ( ) ;
} c a t c h ( I O E x c e p t i o n e ) {
}
r e t u r n ( n u l l ) ;
}
p u b l i c H t t p S e s s i o n c r e a t e S e s s i o n ( C o n t e x t c t x ) {
r e t u r n m a n a g e r . c r e a t e S e s s i o n ( ) . g e t S e s s i o n ( ) ;
}
/ * *
* R e m o v e a l l s e s s i o n s b e c a u s e o u r a s s o c i a t e d C o n t e x t
i s b e i n g s h u t d o w n .
*
* @p a r a m c t x T h e c o n t e x t t h a t i s b e i n g s h u t d o w n
* /
public void r e m o v e S e s s i o n s ( C o n t e x t c t x ) {
/ / X X X X X X a m a n a g e r m a y b e s h a r e d b y m u l t i p l e
/ / c o n t e x t s , w e j u s t w a n t t o r e m o v e t h e s e s s i o n s o f
c t x !
/ / T h e m a n a g e r w i l l s t i l l r u n a f t e r t h a t ( i . e .
k e e p d a t a b a s e
/ / c o n n e c t i o n o p e n
i f ( m a n a g e r i n s t a n c e o f L i f e c y c l e ) {
try {
( ( L i f e c y c l e ) m a n a g e r ) . s t o p ( ) ;
} c a t c h ( L i f e c y c l e E x c e p t i o n e ) {
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( " " + e ) ;
}
}
}
/ * *
* U s e d b y c o n t e x t t o c o n f i g u r e t h e s e s s i o n m a n a g e r ' s i n a c t i v i t y t i m e o u t .
*
* T h e S e s s i o n M a n a g e r m a y h a v e s o m e d e f a u l t s e s s i o n
t i m e o u t , t h e
* C o n t e x t o n t h e o t h e r h a n d h a s i t ' s t i m e o u t s e t b y
t h e d e p l o y m e n t
* d e s c r i p t o r ( w e b . x m l ) . T h i s m e t h o d l e t s t h e C o n t e x t c o n f o r g u r e t h e
* s e s s i o n m a n a g e r a c c o r d i n g t o t h i s v a l u e .
*
* @p a r a m m i n u t e s T h e s e s s i o n i n a c t i v i t y t i m e o u t i n m i n u t e s .
* /
public void setSessionTimeOut ( i n t m i n u t e s ) {
i f ( - 1 ! = m i n u t e s ) {
/ / T h e m a n a g e r w o r k s w i t h s e c o n d s . . .
m a n a g e r .s e t M a x I n a c t i v e I n t e r v a l (minutes * 60);
}
}
}
ServerSessionManagerp a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . * ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;i m p o r t j a v a . i o . * ;
i m p o r t j a v a . n e t . * ;
i m p o r t j a v a . u t i l . * ;i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * **
* @ a u t h o r J a m e s D u n c a n D a v i d s o n [ d u n c a n @ e n g . s u n . c o m ]
* @ a u t h o r J a s o n H u n t e r [ j c h @ e n g . s u n . c o m ]* @ a u t h o r J a m e s T o d d [ g o n z o @ e n g . s u n . c o m ]
* /
p u b l i c c l a s s S e r v e r S e s s i o n M a n a g e r i m p l e m e n t s S e s s i o n M a n a g e r {
p r i v a t e S t r i n g M a n a g e r s m =S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;
p r i v a t e s t a t i c S e r v e r S e s s i o n M a n a g e r m a n a g e r ; / / = n e w S e r v e r SessionManager();
p r o t e c t e d i n t i n a c t i v e I n t e r v a l = -1 ;
s t a t i c {m a n a g e r = n e w S e r v e r S e s s i o n M a n a g e r ( ) ;
}
p u b l i c s t a t i c S e r v e r S e s s i o n M a n a g e r g e t M a n a g e r ( ) {
r e t u r n m a n a g e r ;
}
p r i v a t e H a s h t a b l e s e s s i o n s = n e w H a s h t a b l e ( ) ;
p r i v a t e R e a p e r r e a p e r ;
p r i v a t e S e r v e r S e s s i o n M a n a g e r ( ) {
r e a p e r = R e a p e r . g e t R e a p e r ( ) ;r e a p e r . s e t S e r v e r S e s s i o n M a n a g e r ( t h i s ) ;
r e a p e r . s t a r t ( ) ;
}
p u b l i c H t t p S e s s i o n c r e a t e S e s s i o n ( C o n t e x t c t x ) {
S t r i n g s e s s i o n I d = S e s s i o n I d G e n e r a t o r . g e n e r a t e I d ( ) ;S e r v e r S e s s i o n s e s s i o n = n e w S e r v e r S e s s i o n ( s e s s i o n I d ) ;
s e s s i o n s . p u t ( s e s s i o n I d , s e s s i o n ) ;
i f ( - 1 ! = inactiveInterval ) {
s e s s i o n . s e t M a x I n a c t i v e I n t e r v a l( i n a c t i v e I n t e r v a l );
}r e t u r n s e s s i o n . g e t A p p l i c a t i o n S e s s i o n( c t x , t r u e ) ;
}
p u b l i c H t t p S e s s i o n f i n d S e s s i o n ( C o n t e x t ctx, S t r i n g i d ) {
S e r v e r S e s s i o n s S e s s i o n = (ServerSession )sessions.get(id);
i f ( s S e s s i o n ==null) return null;
r e t u r n s S e s s i o n . getApplicationSession ( c t x , false);
}
/ / X X X/ / s y n c ' d f o r s a f t y - - n o o t h e r t h r e a d s h o u l d b e g e t t i n g s o m e t h i n g
/ / f r o m t h i s w h i l e w e a r e r e a p i n g . T h i s i s n ' t t h e m o s t o p t i m a l
/ / s o l u t i o n f o r t h i s , b u t w e ' l l d e t e r m i n e s o m e t h i n g e l s e l a t e r .
s y n c h r o n i z e d v o i d r e a p ( ) {
E n u m e r a t i o n e n u m = s e s s i o n s . k e y s ( ) ;
w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {
O b j e c t k e y = e n u m . n e x t E l e m e n t ( ) ;S e r v e r S e s s i o n s e s s i o n = ( S e r v e r S e s s i o n ) s e s s i o n s . g e t ( key);
session.reap();s e s s i o n . v a l i d a t e ( ) ;
}
}
s y n c h r o n i z e d v o i d r e m o v e S e s s i o n ( S e r v e r S e s s i o n s e s s i o n ) {
S t r i n g i d = s e s s i o n . g e t I d ( ) ;
s e s s i o n . i n v a l i d a t e ( ) ;
s e s s i o n s . r e m o v e ( i d ) ;}
p u b l i c v o i d r e m o v e S e s s i o n s ( C o n t e x t c o n t e x t ) {E n u m e r a t i o n e n u m = s e s s i o n s . k e y s ( ) ;
w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {O b j e c t k e y = e n u m . n e x t E l e m e n t ( ) ;
S e r v e r S e s s i o n s e s s i o n = ( S e r v e r S e s s i o n ) s e s s i o n s . g e t ( key);
A p p l i c a t i o n S e s s i o n a p p S e s s i o n =s e s s i o n . g e t A p p l i c a t i o n S e s s i o n ( c o n t e x t , f a l s e ) ;
i f ( a p p S e s s i o n ! = n u l l ) {a p p S e s s i o n . i n v a l i d a t e ( ) ;
}
}}
/ * ** U s e d b y c o n t e x t t o c o n f i g u r e t h e s e s s i o n m a n a g e r ' s i n a c t i v i t y t i m e o u t .
*
* The S e s s i o n M a n a g e r m a y h a v e s o m e d e f a u l t s e s s i o n t i m e o u t , t h e* C o n t e x t o n t h e o t h e r h a n d h a s i t ' s t i m e o u t s e t b y t h e d e p l o y m e n t
* d e s c r i p t o r ( w e b . x m l) . T h i s m e t h o d l e t s t h e C o n t e x t c o n f o r g u r e t h e
* s e s s i o n m a n a g e r a c c o r d i n g t o t h i s v a l u e .*
* @p a r a m m i n u t e s T h e s e s s i o n i n a c t i v i t y t i m e o u t i n m i n u t e s .
* /public void setSessionTimeOut ( i n t m i n u t e s ) {
i f ( - 1 ! = m i n u t e s ) {
/ / T h e m a n a g e r w o r k s w i t h s e c o n d s . . .i n a c t i v e I n t e r v a l = ( m i n u t e s * 6 0 ) ;
}
}}
SessionInterceptor
p a c k a g e o r g . a p a c h e . t o m c a t . r e q u e s t ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;i m p o r t o r g . a p a c h e . t o m c a t . u t i l . * ;
i m p o r t j a v a . i o . * ;
i m p o r t j a v a . n e t . * ;i m p o r t j a v a . u t i l . * ;
i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * *
* W i l l p r o c e s s t h e r e q u e s t a n d d e t e r m i n e t h e s e s s i o n I d , a n d s e t i t
* i n t h e R e q u e s t .* I t a l s o m a r k s t h e s e s s i o n a s a c c e s s e d .
*
* T h i s i m p l e m e n t a t i o n o n l y h a n d l e s C o o k i e s s e s s i o n s , p l e a s e e x t e n d o r* a d d n e w i n t e r c e p t o r s f o r o t h e r m e t h o d s .
*
* /p u b l i c c l a s s S e s s i o n I n t e r c e p t o r e x t e n d s B a s e I n t e r c e p t o r i m p l e m e n t s R e q u e s t I n t e r c e p t o r {
/ / G S , s e p a r a t e s t h e s e s s i o n i d f r o m t h e j v m r o u t es t a t i c f i n a l c h a r S E S S I O N I D _ R O U T E _ S E P = ' . ' ;
i n t d e b u g = 0 ;
C o n t e x t M a n a g e r cm;
p u b l i c S e s s i o n I n t e r c e p t o r () {
}
public void s e t D e b u g ( i n t i ) {
S y s t e m . o u t . p r i n t l n( " S e t d e b u g t o " + i ) ;d e b u g = i ;
}
public void setContextManager ( C o n t e x t M a n a g e r c m ) {
t h i s . c m = c m ;
}
p u b l i c i n t r e q u e s t M a p (Request request ) {
S t r i n g s e s s i o n I d = n u l l ;
C o o k i e c o o k i e s [ ] = r e q u e s t . g e t C o o k i e s (); // assert !=null
f o r ( int i = 0 ; i < c o o k i e s . l e n g t h ; i + + ) {
C o o k i e c o o k i e = c o o k i e s [ i ] ;
i f ( c o o k i e . g e t N a m e ( ) . e q u a l s ( " J S E S S I O N I D " ) ) {
s e s s i o n I d = c o o k i e . g e t V a l u e ();
s e s s i o n I d = v a l i d a t e S e s s i o n I d ( r e q u e s t , s e s s i o n I d ) ;i f ( s e s s i o n I d ! = n u l l ) {
r e q u e s t . s e t R e q u e s t e d S e s s i o n I d F r o m C o o k i e ( t r u e ) ;
}}
}
S t r i n g s i g = " ; j s e s s i o n i d = " ;
i n t f o u n d A t =- 1 ;
i f ( d e b u g > 0 ) c m . l o g ( " X X X R U R I = " + r e q u e s t . g e t R e q u e s t U R I());i f ( ( f o u n d A t = r e q u e s t . g e t R e q u e s t U R I ( ) . i n d e x O f ( s i g ) ) ! = - 1){
s e s s i o n I d = r e q u e s t . g e t R e q u e s t U R I ( ) . s u b s t r i n g ( f o u n d A t + s i g . l e n g t h ( ) ) ;
/ / r e w r i t e U R L , d o I n e e d t o d o a n y t h i n g m o r e ?r e q u e s t . s e t R e q u e s t U R I ( r e q u e s t . g e t R e q u e s t U R I ( ) . s u b s t r i n g ( 0 , f o u n d A t ));
sessionId = validateSessionId ( r e q u e s t , sessionId) ;
if (s e s s i o n I d !=null){r e q u e s t . s e t R e q u e s t e d S e s s i o n I d F r o m U R L ( t r u e ) ;
}
}r e t u r n 0 ;
}
/ / X X X w h a t i s t h e c o r r e c t b e h a v i o r i f t h e s e s s i o n i s i n v a l i d ?
/ / W e m a y s t i l l s e t i t a n d j u s t r e t u r n s e s s i o n i n v a l i d .
/ * * V a l i d a t e a n d f i x t h e s e s s i o n i d . I f t h e s e s s i o n i s n o t v alid return null.
* It will also clean up the session from load - b a l a n c i n g s t r i n g s .
* @ r e t u r n s e s s i o n I d , o r n u l l i f n o t v a l i d* /
p r i v a t e S t r i n g v a l i d a t e S e s s i o n I d ( R e q u e s t r e q u e s t , S t r i n g sessionId) {
/ / G S , W e p i g g y b a c k t h e J V M i d o n t o p o f t h e s e s s i o n c o o k i e/ / S e p a r a t e t h e m . . .
i f ( d e b u g > 0 ) c m . l o g ( " Orig sessionId " + s e s s i o n I d );i f ( n u l l ! = s e s s i o n I d ) {
i n t i d e x = s e s s i o n I d. l a s t I n d e x O f( S E S S I O N I D _ R O U T E _ S E P ) ;
if( i d e x > 0 ) {s e s s i o n I d = s e s s i o n I d .s u b s t r i n g ( 0 , i d e x );
}
}
i f ( sessionId ! = n u l l & & s e s s i o n I d . l e n g t h ( ) ! = 0 ) {
/ / G S , W e a r e i n a p r o b l e m h e r e , w e m a y a c t u a l l y g e t/ / m u l t i p l e S e s s i o n c o o k i e s ( o n e f o r t h e r o o t
/ / c o n t e x t a n d o n e f o r t h e r e a l c o n t e x t . . . o r o l d s e ssion
/ / c o o k i e . W e m u s t c h e c k f o r v a l i d i t y i n t h e c u r r e n t c o n t e x t .C o n t e x t c t x = r e q u e s t .g e t C o n t e x t ();
S e s s i o n M a n a g e r s M = c t x . g e t S e s s i o n M a n a g e r ();
i f ( n u l l ! = s M .f i n d S e s s i o n (c t x , sessionId) ) {r e q u e s t .s e t R e q u e s t e d S e s s i o n I d ( sessionId ) ;
i f ( d e b u g > 0 ) c m . l o g ( " F i n a l s e s s i o n i d " + sessionId ) ;
r e t u r n s e s s i o n I d;}
}
r e t u r n n u l l ;}
p u b l i c i n t b e f o r e B o d y ( R e q u e s t r r e q u e s t , R e s p o n s e r e s p o n s e ) {
S t r i n g r e q S e s s i o n I d = r e s p o n s e . g e t S e s s i o n I d ( ) ;i f ( d e b u g > 0 ) c m . l o g ( " B e f o r e B o d y " + r e q S e s s i o n I d ) ;
i f ( r e q S e s s i o n I d = = n u l l )
return 0;
/ / G S , s e t t h e p a t h a t t r i b u t e t o t h e c o o k i e . T h i s w a y/ / m u l t i p l e s e s s i o n c o o k i e s c a n b e u s e d , o n e f o r e a c h
/ / c o n t e x t .
S t r i n g s e s s i o n P a t h = r r e q u e s t . g e t C o n t e x t ( ) . g e t P a t h ( ) ;i f ( s e s s i o n P a t h . l e n g t h ( ) = = 0 ) {
s e s s i o n P a t h = " / " ;
}
// GS, piggyback the jvm route on the session id.
i f ( ! s e s s i o n P a t h . e q u a l s ( " / " ) ) {S t r i n g jvmRoute = r r e q u e s t. g e t J v m R o u t e( ) ;
i f ( n u l l ! = j v m R o u t e ) {
r e q S e s s i o n I d = r e q S e s s i o n I d + S E S S I O N I D _ R O U T E _ S E P + j v m R o u t e ;}
}
C o o k i e c o o k i e = n e w C o o k i e ( " J S E S S I O N I D " ,
r e q S e s s i o n I d ) ;
cookie. s e t M a x A g e ( -1 ) ;cookie. s e t P a t h ( s e s s i o n P a t h ) ;
cookie. s e t V e r s i o n (1);
r e s p o n s e . a d d H e a d e r( CookieTools . g e t C o o k i e H e a d e r N a m e ( c o o k i e ) ,
CookieTools . g e t C o o k i e H e a d e r V a l u e ( c o o k i e ) ) ;
cookie. s e t V e r s i o n (0);r e s p o n s e . a d d H e a d e r( CookieTools . g e t C o o k i e H e a d e r N a m e ( c o o k i e ) ,
CookieTools . g e t C o o k i e H e a d e r V a l u e ( c o o k i e ) ) ;
r e t u r n 0 ;
}
/ * * N o t i f i c a t i o n o f c o n t e x t s h u t d o w n
* /public void c o n t e x t S h u t d o w n ( Context c t x )
t h r o w s T o m c a t E x c e p t i o n
{i f ( ctx . g e t D e b u g ( ) > 0 ) c t x . l o g ( " R e m o v i n g s e s s i o n s f r o m " + c t x );
c t x . g e t S e s s i o n M a n a g e r ( ) .r e m o v e S e s s i o n s ( c t x) ;
}
}
ServerSession
p a c k a g e o r g . a p a c h e . t o m c a t . s e s s i o n ;
i m p o r t o r g . a p a c h e . t o m c a t . c o r e . * ;
i m p o r t o r g . a p a c h e . t o m c a t . u t i l . S t r i n g M a n a g e r ;
i m p o r t j a v a . i o . * ;i m p o r t j a v a . n e t . * ;
i m p o r t j a v a . u t i l . * ;
i m p o r t j a v a x . s e r v l e t . * ;i m p o r t j a v a x . s e r v l e t . h t t p . * ;
/ * ** C o r e i m p l e m e n t a t i o n o f a s e r v e r s e s s i o n
*
* @ a u t h o r J a m e s D u n c a n D a v i d s o n [ d u n c a n @ e n g . s u n . c o m ]* @ a u t h o r J a m e s T o d d [ g o n z o @ e n g . s u n . c o m ]
* /
p u b l i c c l a s s S e r v e r S e s s i o n {
p r i v a t e S t r i n g M a n a g e r s m =S t r i n g M a n a g e r . g e t M a n a g e r ( " o r g . a p a c h e . t o m c a t . s e s s i o n " ) ;
p r i v a t e H a s h t a b l e v a l u e s = n e w H a s h t a b l e ( ) ;
p r i v a t e H a s h t a b l e a p p S e s s i o n s = n e w H a s h t a b l e ( ) ;p r i v a t e S t r i n g i d ;
p r i v a t e l o n g c r e a t i o n T i m e = System. c u r r e n t T i m e M i l l i s( ) ; ;
p r i v a t e l o n g t h i s A c c e s s T i m e = c r e a t i o n T i m e ;p r i v a t e i n t i n a c t i v e I n t e r v a l = -1 ;
S e r v e r S e s s i o n ( S t r i n g i d ) {this.id = id;
}
p u b l i c S t r i n g g e t I d () {
r e t u r n i d ;
}
public long g e t C r e a t i o n T i m e () {
r e t u r n creationTime ;}
p u b l i c A p p l i c a t i o n S e s s i o n g e t A p p l i c a t i o n S e s s i o n ( C o n t e x t c o n t e x t ,
boolean c r e a t e ) {
A p p l i c a t i o n S e s s i o n a p p S e s s i o n =( A p p l i c a t i o n S e s s i o n )a p p S e s s i o n s .get(context);
i f ( a p p S e s s i o n = = n u l l & & c r e a t e ) {
/ / X X X
/ / s y n c t o e n s u r e v a l i d ?
a p p S e s s i o n = n e w A p p l i c a t i o n S e s s i o n ( i d , t h i s , c o n t e x t ) ;
a p p S e s s i o n s . p u t ( c o n t e x t , a p p S e s s i o n ) ;}
/ / X X X/ / m a k e s u r e t h a t w e h a v e n ' t g o n e o v e r t h e e n d o f o u r
/ / i n a c t i v e i n t e r v a l - - i f s o , i n v a l i d a t e a n d c r e a t e
// a new appSession
r e t u r n a p p S e s s i o n ;
}
v o i d r e m o v e A p p l i c a t i o n S e s s i o n ( C o n t e x t c o n t e x t ) {
a p p S e s s i o n s . r e m o v e ( c o n t e x t ) ;}
/ * ** C a l l e d b y c o n t e x t w h e n r e q u e s t c o m e s i n s o t h a t a c c e s s e s a n d
* i n a c t i v i t i e s c a n b e d e a l t w i t h a c c o r d i n g l y .
* /
v o i d v a l i d a t e ( )
s y n c h r o n i z e d v o i d i n v a l i d a t e ( ) {
E n u m e r a t i o n e n u m = a p p S e s s i o n s . k e y s ( ) ;
w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {
O b j e c t k e y = e n u m . n e x t E l e m e n t ( ) ;A p p l i c a t i o n S e s s i o n a p p S e s s i o n =
( A p p l i c a t i o n S e s s i o n ) a p p S e s s i o n s . g e t ( k e y ) ;
a p p S e s s i o n . i n v a l i d a t e ( ) ;
}
}
p u b l i c v o i d p u t V a l u e ( S t r i n g n a m e , O b j e c t v a l u e ) {
i f ( n a m e = = n u l l ) {S t r i n g m s g = s m . g e t S t r i n g ( " s e r v e r S e s s i o n . v a l u e . i a e " ) ;
t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( m s g ) ;}
r e m o v e V a l u e ( n a m e ) ; / / r e m o v e a n y e x i s t i n g b i n d i n gv a l u e s . p u t ( n a m e , v a l u e ) ;
}
p u b l i c O b j e c t g e t V a l u e ( S t r i n g n a m e ) {
i f ( n a m e = = n u l l ) {
S t r i n g m s g = s m . g e t S t r i n g ( " s e r v e r S e s s i o n . v a l u e . i a e " ) ;
t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( m s g ) ;
}
r e t u r n v a l u e s . g e t ( n a m e ) ;
}
p u b l i c E n u m e r a t i o n g e t V a l u e N a m e s ( ) {
r e t u r n v a l u e s . k e y s ( ) ;}
p u b l i c v o i d r e m o v e V a l u e ( S t r i n g n a m e ) {v a l u e s . r e m o v e ( n a m e ) ;
}
p u b l i c v o i d s e t M a x I n a c t i v e I n t e r v a l ( i n t i n t e r v a l ) {
i n a c t i v e I n t e r v a l = i n t e r v a l ;
}
p u b l i c i n t g e t M a x I n a c t i v e I n t e r v a l ( ) {
r e t u r n i n a c t i v e I n t e r v a l ;}
/ / X X X/ / s y n c ' d f o r s a f t y - - n o o t h e r t h r e a d s h o u l d b e g e t t i n g s o m e t h i n g
/ / f r o m t h i s w h i l e w e a r e r e a p i n g . T h i s i s n ' t t h e m o s t o p t i m a l
/ / s o l u t i o n f o r t h i s , b u t w e ' l l d e t e r m i n e s o m e t h i n g e l s e l a t e r .
s y n c h r o n i z e d v o i d r e a p ( ) {
E n u m e r a t i o n e n u m = a p p S e s s i o n s . k e y s ( ) ;
w h i l e ( e n u m . h a s M o r e E l e m e n t s ( ) ) {
O b j e c t k e y = e n u m . n e x t E l e m e n t ( ) ;A p p l i c a t i o n S e s s i o n a p p S e s s i o n =
( A p p l i c a t i o n S e s s i o n ) a p p S e s s i o n s . g e t ( k e y ) ;
a p p S e s s i o n . v a l i d a t e ( ) ;
}
}}
p r i v a t e l o n g l a s t A c c e s s e d = c r e a t i o n T i m e ;
p r i v a t e i n t i n a c t i v e I n t e r v a l = - 1 ;
v o i d a c c e s s e d ( ) {
/ / s e t l a s t a c c e s s e d t o t h i s A c c e s s T i m e a s i t w i l l b e left over
/ / f r o m t h e p r e v i o u s a c c e s s
l a s t A c c e s s e d = t h i s A c c e s s T i m e ;t h i s A c c e s s T i m e = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ;
v a l i d a t e ( ) ;}
v o i d v a l i d a t e ( ) {/ / i f w e h a v e a n i n a c t i v e i n t e r v a l , c h e c k t o s e e i f
w e ' v e e x c e e d e d i t
i f ( i n a c t i v e I n t e r v a l ! = - 1 ) {i n t t h i s I n t e r v a l =
( i n t ) ( S y s t e m . c u r r e n t T i m e M i l l i s ( ) -
l a s t A c c e s s e d ) / 1 0 0 0 ;
i f ( t h i s I n t e r v a l > i n a c t i v e I n t e r v a l ) {
i n v a l i d a t e ( ) ;}
}
}
p u b l i c l o n g g e t L a s t A c c e s s e d T i m e ( ) {
i f ( v a l i d ) {r e t u r n l a s t A c c e s s e d ;
} e l s e {
S t r i n g m s g = s m . g e t S t r i n g ( " a p p l i c a t i o n S e s s i o n . s e s s i o n . i s e " ) ;
t h r o w n e w I l l e g a l S t a t e E x c e p t i o n ( m s g ) ;}
}
p u b l i c l o n g g e t L a s t A c c e s s e d T i m e ( ) {
r e t u r n l a s t A c c e s s e d ;}
p r i v a t e l o n g l a s t A c c e s s e d = c r e a t i o n T i m e ;
v o i d a c c e s s e d ( ) {/ / s e t l a s t a c c e s s e d t o t h i s A c c e s s T i m e a s i t w i l l b e
left over
/ / f r o m t h e p r e v i o u s a c c e s s
l a s t A c c e s s e d = t h i s A c c e s s T i m e ;
t h i s A c c e s s T i m e = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ;
}
v o i d v a l i d a t e ( ) {/ / i f w e h a v e a n i n a c t i v e i n t e r v a l , c h e c k t o s e e i f
/ / w e ' v e e x c e e d e d i t
i f ( i n a c t i v e I n t e r v a l ! = - 1) {
i n t t h i s I n t e r v a l =( i n t ) ( S y s t e m . c u r r e n t T i m e M i l l i s ( ) -
l a s t A c c e s s e d ) / 1 0 0 0 ;
i f ( t h i s I n t e r v a l > i n a c t i v e I n t e r v a l ) {
i n v a l i d a t e ( ) ;
S e r v e r S e s s i o n M a n a g e r s s m =
S e r v e r S e s s i o n M a n a g e r . g e t M a n a g e r ( ) ;
s s m . r e m o v e S e s s i o n ( t h i s ) ;
}}
}
p r i v a t e l o n g l a s t A c c e s s e d T i m e = c r e a t i o n T i m e ;
/ * *
* R e t u r n t h e l a s t t i m e t h e c l i e n t s e n t a r e q u e s t a s s o c i a t e d w i t h t h i s
* s e s s i o n , a s t h e n u m b e r o f m i l l i s e c o n d s
s i n c e m i d n i g h t , J a n u a r y 1 , 1 9 7 0* G M T . A c t i o n s t h a t y o u r a p p l i c a t i o n t a k e s ,
s u c h a s g e t t i n g o r s e t t i n g
* a v a l u e a s s o c i a t e d w i t h t h e s e s s i o n , d o n o t a f f e c t t h e a c c e s s t i m e .
* /
public long g e t L a s t A c c e s s e d T i m e () {
r e t u r n ( t h i s . l a s t A c c e s s e d T i m e ) ;
}
t h i s . l a s t A c c e s s e d T i m e = t i m e ;
/ * *
* U p d a t e t h e a c c e s s e d t i m e i n f o r m a t i o n f o r t h i s s e s s i o n . T h i s m e t h o d
* s h o u l d b e c a l l e d b y t h e c o n t e x t w h e n a
r e q u e s t c o m e s i n f o r a p a r t i c u l a r* s e s s i o n , e v e n i f t h e a p p l i c a t i o n d o e s n o t
r e f e r e n c e i t .
* /p u b l i c v o i d a c c e s s ( ) {
t h i s . l a s t A c c e s s e d T i m e = t h i s . t h i s A c c e s s e d T i m e ;
t h i s . t h i s A c c e s s e d T i m e =
S y s t e m . c u r r e n t T i m e M i l l i s ( ) ;t h i s . i s N e w = f a l s e ;
}
l a s t A c c e s s e d T i m e = 0 L ;
l a s t A c c e s s e d T i m e = ( ( L o n g )
s t r e a m . r e a d O b j e c t ( ) ) . l o n g V a l u e ( ) ;
m a x I n a c t i v e I n t e r v a l = ( ( I n t e g e r ) s t r e a m . r e a d O b j e c t ( ) ) . i n t V a l u e ( ) ;
i s N e w = ( ( B o o l e a n )
s t r e a m . r e a d O b j e c t ()). booleanValue ( ) ;
s t r e a m . w r i t e O b j e c t ( n e w L o n g ( l a s t A c c e s s e d T i m e ) ) ;
s M . a c c e s s e d ( c t x , r e q u e s t , s e s s i o n I d ) ;
p u b l i c v o i d a c c e s s e d ( C o n t e x t c t x , R e q u e s t r e q , S t r i n g i d
) {A p p l i c a t i o n S e s s i o n
a p S = ( A p p l i c a t i o n S e s s i o n ) f i n d S e s s i o n ( c t x , i d ) ;
i f ( a p S = = n u l l ) r e t u r n ;
S e r v e r S e s s i o n s e r v S = a p S . g e t S e r v e r S e s s i o n ( ) ;
s e r v S . a c c e s s e d ( ) ;a p S . a c c e s s e d ( ) ;
/ / c a c h e i t - n o n e e d t o c o m p u t e i t a g a i nr e q . s e t S e s s i o n ( a p S ) ;
}
/ * ** I n v a l i d a t e a l l s e s s i o n s t h a t h a v e e x p i r e d .
* /
p r i v a t e v o i d p r o c e s s E x p i r e s ( ) {
l o n g t i m e N o w = S y s t e m . c u r r e n t T i m e M i l l i s ( ) ;
S e s s i o n s e s s i o n s [ ] = f i n d S e s s i o n s ( ) ;
f o r ( int i = 0 ; i < s e s s i o n s . l e n g t h ; i + + ) {
StandardSession session = ( S t a n d a r d S e s s i o n ) s e s s i o n s [ i ] ;
i f ( ! s e s s i o n . i s V a l i d( ) )
c o n t i n u e ;i n t m a x I n a c t i v e I n t e r v a l =
s e s s i o n .g e t M a x I n a c t i v e I n t e r v a l ();
if (m a x I n a c t i v e I n t e r v a l < 0 )c o n t i n u e ;
i n t t i m e I d l e = / / T r u n c a t e , d o n o t r o u n d u p
( i n t) ( ( t i m e N o w -s e s s i o n .g e t L a s t A c c e s s e d T i m e ( ) ) / 1 0 0 0 L ) ;
if (t i m e I d l e >= m a x I n a c t i v e I n t e r v a l )
session.expire();}
}
/ * *
* M a r k t h e s p e c i f i e d s e s s i o n ' s l a s t a c c e s s e d t i m e . T h i s s h o u l d b e
* c a l l e d f o r e a c h r e q u e s t b y a R e q u e s t I n t e r c e p t o r .
*
* @p a r a m s e s s i o n T h e s e s s i o n t o b e m a r k e d
* /
p u b l i c v o i d a c c e s s e d ( C o n t e x t c t x , Request r e q , String
i d ) {
H t t p S e s s i o n s e s s i o n = findSession ( c t x , i d ) ;
i f ( s e s s i o n = = n u l l ) r e t u r n ;
i f ( s e s s i o n i n s t a n c e o f Session)
( ( S e s s i o n ) s e s s i o n ) . a c c e s s ( ) ;
/ / c a c h e t h e H t t p S e s s i o n - a v o i d a n o t h e r f i n d
r e q . s e t S e s s i o n ( s e s s i o n ) ;
}
Tabla de contenidos
• Introducción• La idea de la separación de aspectos• Lenguajes de Programación orientados a aspectos• El lenguaje AspectJ• Ejemplos• Taller
21
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
22
• La ortogonalidad es inherente a los sistemas complejos• Incumbencias ortogonales
– Tienen un propósito claro– Tienen una estructura natural
• Conjunto definido de métodos, cruces de fronteras entre módulos, puntos de utilización de recursos, líneas de flujo de datos,....
• Por tanto, capturemos la estructura de las incumbencias ortogonales explícitamente– De forma modular– Con soporte lingüístico y herramientas
• Los aspectos son nada más que – Incumbencias ortogonales bien modularizadas
Concepto básicoLa idea de la separación de aspectos
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
23
• Dos niveles de separación de aspectos:– Nivel conceptual: Mecanismo importante para gestionar la
complejidad en cualquier disciplina• Proporcionan una definición clara y una identificación conceptual
de cada asunto que lo distingue de otros• Asegura que los conceptos individuales son primitivas que no
están compuestas de otros conceptos.
– Nivel de implantación: La separación de asuntos necesita proporcionar una organización adecuada que permita aislar los asuntos. El objetivo a este nivel es aislar los bloques de código que tienen que ver con los distintos asuntos y combinarlos con un acoplamiento bajo entre ellos.
• Las metodologías de diseño reconocen la importancia de la abstracción conceptual y la separación de aspectos.
Concepto básicoLa idea de la separación de aspectos
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
24
Concepto básicoLa idea de la separación de aspectos
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
25
1. Sin embargo, los asuntos identificados a nivel conceptual se introducen en la implantación a través de constructores de los lenguajes de programación– Ejemplo: Begin/EndTransaction → gestionan persistencia,
sincronización y tolerancia a fallos, en un único constructor
– Lenguaje B2. O se practica la separación de aspectos a nivel
conceptual pero no a nivel de implantación → código monolítico con sentencias intercaladas para la gestión de los distintos asuntos (lenguaje A)
3. O se aplica la separación de aspectos tanto a nivel conceptual como de implantación: Lenguaje C
Concepto básicoLa idea de la separación de aspectos
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
26
• ¿ Qué podemos hacer con un problema como este?– Toda llamada a foo viene precedida de una llamada log
:
System.out.println("foo called");
Helper.foo(n/3);
:
:
System.out.println("foo called");
Helper.foo(i+j+k);
:
:
System.out.println("foo called");
Helper.foo(x);
:
class Helper {:
public static void foo(int n) {
…
}:
}
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Problemas típicosLa idea de la separación de aspectos
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
27
class Helper {:
public static void foo(int n) {
System.out.println("foo called.");
…
}:
}
:
Helper.foo(n/3);
::
Helper.foo(i+j+k);
: :
Helper.foo(x);
:
Nada: los procedimientos pueden modularizar este caso
A menos que en la traza se use para algo el contexto desde el que se llame, no necesitamos controlar el
objeto Helper origen de la llamada
Problemas típicosLa idea de la separación de aspectos
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
28
2Point
getX()getY()setX(int)setY(int)moveBy(int, int)draw()refresh()
Line
getP1()getP2()setP1(Point)setP2(Point)moveBy(int, int)draw()refresh()
FigureElement
moveBy(int, int)
¿ Y con ésto?
Todas las subclases tien un método idéntido
Problemas típicosLa idea de la separación de aspectos
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
29
2Point
getX()getY()setX(int)setY(int)moveBy(int, int)draw()
Line
getP1()getP2()setP1(Point)setP2(Point)moveBy(int, int)draw()
FigureElement
moveBy(int, int)refresh()
No necesariamente: La herencia puede modularizar este
problema
Problemas típicosLa idea de la separación de aspectos
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
30
2Point
getX()getY()setX(int)setY(int)moveBy(int, int)draw()
Line
getP1()getP2()setP1(Point)setP2(Point)moveBy(int, int)draw()
FigureElement
moveBy(int, int)refresh()
¿ Y con esto? Todos los métodos terminan con llamadas a
Display.update();
Problemas típicosLa idea de la separación de aspectos
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
31
DisplayUpdating
2Point
getX()getY()setX(int)setY(int)moveBy(int, int)draw()
Line
getP1()getP2()setP1(Point)setP2(Point)moveBy(int, int)draw()
FigureElement
moveBy(int, int)refresh()
after(): call(void FigureElement+.set*(..))|| call(void
FigureElement.moveBy(int, int)){Display.update();
}
after(): call(void FigureElement+.set*(..))|| call(void FigureElement.moveBy(int, int)){Display.update();
}
Problemas típicosLa idea de la separación de aspectos
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sí, este es un ejemplo típico
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
32
• Sincronización• Control de la Localización• Restricciones de tiempo real• Recuperación de fallos• Logging• El dilema del arquitecto• .....
Problemas típicosLa idea de la separación de aspectos
Tabla de contenidos • Introducción• La idea de POA– Concepto básico– Problemas típicos– Observaciones y cuestiones– El dilema del arquitecto• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
33
• La predicción de los requerimientos futuros es una tarea difícil
• ¿ Debería un arquitecto incluir un mecanismo de logging en sistemas que inicialmente, no lo necesitan?
– ¿ Dónder pondríamos las llamadas al logging?– ¿ Qué información recogeríamos?– ¿ Qué información deberíamos recoger?
• ¿ O debería olvidarse de futuros requerimientos y encontrarse enel futuro con que es necesario cambiar o incluso reimplementar partes del sistema?
El dilema del arquitectoLa idea de la separación de aspectos
Tabla de contenidos • Introducción–Problema de las metodologías tradicionales– El sistema como un conjunto de incumbencias– La tarjeta de crédito– Problemas derivados de la mezcla de incumbencias– El dilema del arquitecto• La POA• LPOA• El lenguaje AspectJ• Ejemplos• Taller
343434
Tabla de contenidos
• Introducción• La programación orientada a aspectos• Lenguajes de Programación orientados a aspectos• El lenguaje AspectJ• Ejemplos• Taller
34
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
35
Esquema • Introducción• Fundamentos de POA– Introducción– Definición de aspecto– Desarrollo– Entrelazado– Beneficios• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Introducción
• Es necesario modularizar la implantación de los aspectos ortogonales
– S&T ß principio, mecanismo à estructura modular• S&T no es específico a la AOP
– La AOP es sólo una técnica de modularización– AOP es un método para separación de incumbencias
• AOP permite implementar incumbencias individuales de modo poco acoplado y combinar estas implantaciones para formar el sistema final
• AOP es una evolución lógica de OOP
Fundamentos de POA
Aspecto → Implantación de esos asuntos técnicos
Clase → Implantación de esos asuntos del problema base
Implantaciones modulares de asuntos ortogonales tanto del problema base como técnicos
Implantaciones modulares de asuntos del problema base
comunes
AOPOOP
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
36
Esquema • Introducción• Fundamentos de POA– Introducción– Definición de aspecto– Desarrollo– Entrelazado– Beneficios• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Definición de aspecto
• Objetivo, concepto o área de interés• Unidad modular que se disemina por la estructura de
otras unidades funcionales• Unidad básica de la POA ⇒ Parte de una aplicación
que describe las cuestiones clave relacionadas con la semántica o el rendimiento
• No suelen ser unidades de descomposición funcional del sistema, sino propiedades que afectan al rendimiento o la semántica de los componentes.
Fundamentos de POA
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
37
Etapas del desarrollo de aspectos
1. Descomposición aspectual: La analogía del prisma
2. Implantación de cada aspecto por separado1. Lenguaje base: OO
• Implementa la funcionalidad básica por medio de componentes
2. LOA: define una nueva unidad de programación para encapsular las funcionalidades que cruzan todo el código
Fundamentos de POA
Esquema • Introducción• Fundamentos de POA– Introducción– Definición de aspecto– Desarrollo– Entrelazado– Beneficios• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
38
Etapas del desarrollo de aspectos
3. Recomposición aspectual3. Tejedor: Componentes y aspectos interactúan
1. Puntos de enlace: lugares del código en los que se puede aumentar con comportamientos adicionales especificados en los aspectos
2. Tejedor: mezcla los diferentes mecanismos de abstracción y composición que aparecen en los lenguajes de aspecto
Fundamentos de POA
Esquema • Introducción• Fundamentos de POA– Introducción– Definición de aspecto– Desarrollo– Entrelazado– Beneficios• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
39
Entrelazado
• Tejedor: Combina el código que implanta la funcionalidad básica con los distintos módulos que implantan los aspectos, pudiendo cada aspecto estar codificado con un lenguaje diferente.
• Mezcla diferentes fragmentos de ejecución según criterios que se le suministran.
Fundamentos de POA
Esquema • Introducción• Fundamentos de POA– Introducción– Definición de aspecto– Desarrollo– Entrelazado– Beneficios• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
40
Entrelazado
• Ejemplo: La clase de la tarjeta de créditopublic class CreditCardProcessor {
public void debit(CreditCard card, Currency amount)throws InvalidCardException,NotEnoughAmountException,CardExpiredException{
// Debiting logic}public void credit(CreditCard card, Currency amount)throws InvalidCardException {
// Crediting logic}
}
• Interface logging
public interface Logger {public void log(String message);
}
Fundamentos de POA
Esquema • Introducción• Fundamentos de POA– Introducción– Definición de aspecto– Desarrollo– Entrelazado– Beneficios• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
41
Entrelazado
• La composición deseada requiere las siguientes reglas de entrelazado, expresadas aquí en lenguaje natural. – Registrar el comienzo de cada operación pública– Registrar la finalización de cada operación pública– Registrar cada excepción lanzada por cada operación
pública• El tejedor, usaría estas reglas de entrelazado y las
implementaciones de los distintos asuntos para producir algo equivalente al siguiente código
Fundamentos de POA
Esquema • Introducción• Fundamentos de POA– Introducción– Definición de aspecto– Desarrollo– Entrelazado– Beneficios• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
42
Entrelazado
public class CreditCardProcessorWithLogging {Logger _logger;
public void debit(CreditCard card, Money amount) throws InvalidCardException,NotEnoughAmountException, CardExpiredException {
_logger.log("Starting CreditCardProcessor.credit(CreditCard,Money) " + "Card: " + card + " Amount: " + amount);
// Debiting logic
_logger.log("CompletingCreditCardProcessor.credit(CreditCard, Money) “ + "Card: " + card + " Amount: " + amount);
}
Fundamentos de POA
Esquema • Introducción• Fundamentos de POA– Introducción– Definición de aspecto– Desarrollo– Entrelazado– Beneficios• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
43
Entrelazado
public void credit(CreditCard card, Moneyamount)throws InvalidCardException {System.out.println("Debiting");_logger.log("StartingCreditCardProcessor.debit(CreditCard,Money) " + "Card: " + card + " Amount: " + amount);
// Crediting logic
_logger.log("Completing CreditCardProcessor.credit(CreditCard,Money) “ + "Card: " + card + " Amount: " + amount);
}}
Fundamentos de POA
Esquema • Introducción• Fundamentos de POA– Introducción– Definición de aspecto– Desarrollo– Entrelazado– Beneficios• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
44
Entrelazado
• Entrelazado estático– Implica modificar el código fuente de una clase insertando
sentencias en los puntos de enlace.– Ejemplo, el tejedor de AspectJ– Ventaja: Evita que el nivel de abstracción que se introduce con
la POA derive en un impacto negativo en el rendimiento de la aplicación
– Inconveniente: Difícil identificar los aspectos en el código una vez tejido, lo que implica que, si se desea adaptar o reemplazar los aspectos de forma dinámica, es ineficiente o imposible
• Entrelazado dinámico– Los aspectos deben existir, de forma explícita, tanto en tiempo
de compilación, como de ejecución• Los aspectos deben modelarse como objetos• El tejedor puede añadir, modificar y borrar aspectos en tiempo de
ejecución → necesita reflexión (reflectividad)– Inconveniente: Rendimiento, mayor ocupación de memoria– Ejemplo: AOP/ST
Fundamentos de POA
Esquema • Introducción• Fundamentos de POA– Introducción– Definición de aspecto– Desarrollo– Entrelazado– Beneficios• LPOA• El lenguaje AspectJ• Ejemplos• Taller
Esquema de la Presentación
• Introducción • La programación orientada a aspectos• Lenguajes de Programación orientados a aspectos• El lenguaje AspectJ• Ejemplos• Taller
45
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
46
Esquema • Introducción • La POA• Lenguajes de POA– Anatomía de un LPOA– Beneficios • El lenguaje AspectJ• Ejemplos• Taller
Anatomía de los LPOALenguajes de programación orientada a aspectos
• Especificación del lenguaje• Implantación de asuntos: Establece una
correspondencia entre un requerimiento individual y el código de forma que un compilador puede traducirlo a código ejecutable. Puedes usar cualquier lenguaje
• Especificación de reglas de tejido• ¿Cómo componer asuntos implantados de forma
independiente para formar el sistema final?• La implantación necesitará usar o crear un lenguaje
para especificar reglas para componer diferentes trozos de la implantación para formar el sistema final.
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
47
Esquema • Introducción • La POA• Lenguajes de POA– Anatomía de un LPOA– Beneficios • El lenguaje AspectJ• Ejemplos• Taller
Anatomía de los LPOALenguajes de programación orientada a aspectos
• Implantación del lenguaje• El compilador AOP ejecuta dos pasos lógicos:
• Combinar los asuntos individuales• Convertir el resultado en ejecutable
• Posibles implantaciones del tejedor• Fuente-a-fuente:
• Preprocesar el código fuente con los aspectos individuales→produce código fuente tejido
• El compilador AOP alimenta con este código el compilador del lenguaje base para producir el ejecutable final.
• La misma aproximación se podría llevar a cabo tejiendo a nivel de byte code (en el caso de java)
• Tejido just-in-time• La máquina abstracta debe conocer el concepto de
aspecto• La vm cargaría en primer lugar las reglas de tejido y
las aplicaría a las clases que se cargasen en adelante.
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
48
• Implementación modular de los aspectos ortogonales
•Código menos disperso
•Más natural
•Más corto
• Sistemas más fáciles de evolucionar
• Toma de decisiones de diseño más tarde
• Más reutilización del código
•Aspectos plug&play cuando fuesen necesarios
Esquema • Introducción • La POA• Lenguajes de POA– Anatomía de un LPOA– Beneficios • El lenguaje AspectJ• Ejemplos• Taller
BeneficiosLenguajes de programación orientada a aspectos
Esquema de la Presentación
• Introducción• La programación orientada a aspectos• Lenguajes de Programación orientados a aspectos• El lenguaje AspectJ• Ejemplos• Taller
49
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
50
• Lenguaje de programación de propósito general• Especificación
– Define varios constructores y la semántica para soportar conceptos OA
• Implantación – Ofrece herramientas para compilar, depurar y documentar el
código
• Extiende Java con capacidad de programación de aspectos : Jointpoint
• Extiende el lenguaje con 4 nuevos constructores– Pointcut– Advice– Introduction – Aspect
Visión generalEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Especifican las reglas de entrelazadoAfectan dinámicamente al flujo del programa
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
51
operaciones que provocan movimiento
Métodos factoríaDisplay
*
2Point
getX()getY()setX(int)setY(int)move(int, int)
Line
getP1()getP2()setP1(Point)setP2(Point)move(int, int)
Figure
makePoint(..)makeLine(..)
FigureElement
move(int, int)
Conceptos básicosEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
52
Conceptos básicosEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
class Line implements FigureElement{private Point p1, p2;
Point getP1() { return p1; }Point getP2() { return p2; }
void setP1(Point p1) { this.p1 = p1; }void setP2(Point p2) { this.p2 = p2; }
}
class Point implements FigureElement { private int x = 0, y = 0;
int getX() { return x; }int getY() { return y; }
void setX(int x) { this.x = x; }void setY(int y) { this.y = y; }
}
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
53
• Hay que actualizar la pantalla cada vez que se mueve un objeto
• Rastreo del movimiento– Ante una colección de elementos de una figura– Que cambian periódicamente– Es necesario monitorizar los cambios para refrescar la
pantalla cuando se necesite– El conjunto de objetos puede ser complejo
• Jerarquía• Eventos asíncronos
• Otros ejemplos similares– Vida de las sesiones– Caché de valores
Conceptos básicosEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
54
• Jointpoint– AspectJ define un modelo en el que la ejecución puede
representarse mediante un grafo.– Nodos: jointpoints: Punto bien definido en el grafo que
representa la ejecución de un programa– Aristas: Flujo de control
• En este modelo, el control pasa dos veces por cada nodo(jointpoint): una en el sentido hacia el nodo, otra en el camino de vuelta.
Conceptos básicos: jointpointEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
55
Figura
Línea
y retornao excepción
Llamada a método
dispatch
dispatch
Puntos fundamentales en el grafo dinámico de llamadas
Llamada a método
y retornao excepción
Ejecución de un método
y retornao excepción
Conceptos básicos: jointpointEl lenguaje AspectJ
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
56
• AspectJ limita la disponibilidad de joinpoints a aquellos factibles de ser utilizados de forma sistemática– Llamada y ejecución de un método– Llamada y ejecución de un constructor– Recepción de una llamada a un método o constructor– Acceso de lectura/escritura sobre un campo– Ejecución del gestor de una excepción– Inicialización estática y dinámica
Conceptos básicos: jointpointEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Línea
dispatch
Jointpoint llamada método
Jointpoint ejecución método
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
57
Conceptos básicos : jointpointEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
ln1.move(3,4);
• Ejemplo: Editor de figuras
movemove
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
58
Línea
Figura
Punto
Punto
Todos los joinpoints de esta figura están dentro del flujo de
control de este joinpoint
Llamadas repetidas al mismo método
en el mismo objeto provoca múltiples
joinpoints
Conceptos básicos : jointpointEl lenguaje AspectJ
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
59
• Pointcut– Constructor que captura o identifica un jointpoint específico
en el flujo de un programa• Filtra un subconjunto de todos los jointpoints basándose en
criterios definidos (nombre de la función,parámetros,....)
– Una vez capturado, es posible especificar reglas de tejido que involucren el jointpoint
• Ejecutar determinada acción antes/después de la ejecución del jointpoint
– pointcut nombre (contexto): eventos del corte(signatura)– Ejemplo
pointcut callSayMessage():call(public static void HelloWorld.say*(..));
Conceptos básicos: PointcutEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
tipo de pointcut
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
60
Cada vez que se encuentra una llamada a <void Line.setP1(Point)>o <void Line.setP2(Point)>
Llamada a “void Line.setP2(Point)”
Llamada a “void Line.setP1(Point)”
pointcut move(): call(void Line.setP1(Point)) || call(void Line.setP2(Point));
El lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Conceptos básicos: Pointcut
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
61
• Comodines y operadores– Dado que, por definición, los aspectos ortogonales se
dispersan por varios módulos y tienen que ver con varios jointpoints en el sistema, el lenguaje debe proporcionar medios económicos para capturar los jointpoints requeridos
– Sintaxis basada en comodines: * .. +– Operadores
• Unario !• Binarios || &&
• Sintaxis de la signatura– Se utiliza la signatura para especificar los lugares en los que
se desea capturar un jointpoint
Conceptos básicos : PointcutEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
62
• Pointcut: llamadas a métodos y constructores– call(public void MyClass.myMethod(String))– call(void MyClass.myMethod(..))– call(* MyClass.myMethod(..))– call(* MyClass.myMethod*(..))– call(* MyClass.myMethod*(String,..))– call (* *.myMethod(..))– call (MyClass.new())– call (MyClass.new(..))– call (MyClass+.new())– call (public * com.mycompany..*.*(..))
Conceptos básicos : PointcutEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
63
• Pointcut: llamadas a métodos y constructores– Ejemplos
pointcut move(): call(void Line.setP1(Point)) || call(void Line.setP2(Point)) ||call(void Point.setX(int)) ||call(void Point.setY(int));
Conceptos básicos : PointcutEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
64
• Pointcut: ejecución de métodos y constructores– execution(public void MyClass.myMethod(String))– execution(void MyClass.myMethod(..))– execution(* MyClass.myMethod(..))– execution(* MyClass.myMethod*(..))– execution(* MyClass.myMethod*(String,..))– execution (* *.myMethod(..))– execution (MyClass.new())– execution (MyClass.new(..))– execution (MyClass+.new())– execution (public * com.mycompany..*.*(..))
pointcut traza(): execute(* Line.*(..)) || execute(* Point.*(..));
Conceptos básicos : PointcutEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
65
• Pointcut: acceso a campos– get(PrintStream System.out)– Set(int MyClass.x)
pointcut acceso(): set (private int x);• Pointcut: gestión de excepciones
– handler(RemoteException)– handler(IOException+)
• Pointcut: inicialización de clases– staticinitialization(MyClass)– staticinitialization(MyClass+)
Conceptos básicos : PointcutEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
66
• Pointcut: Control de flujo– Capturan jointpoints basados en el flujo de control de
jointpoints capturados por otro pointcut.– El flujo de control de un jointpoint define el flujo de
instrucciones del programa que ocurren como resultado de la invocación del jointpoint.
– cflow(call(*MyClass.myMethod(..))• Cualquier jointpoint en el flujo de cualquier llamada a myMethod
incluyendo la llamada a myMethod
– cflowbelow(call(*MyClass.myMethod(..))• Idem, pero excluye la llamada a myMethod.
– Un pointcut de este tipo siempre incluye otro pointcut como argumento
Conceptos básicosEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
67
• Pointcuts basados en los objetos en tiempo de ejecución – Capturan los jointpoints basándose en los tipos de los
objetos en tiempo de ejecución– this(tipo o identificador) : el objeto actual
• Captura todos los jointpoints que tienen a este objeto asociado con ellos bien porque tenga el tipo especificado o porque sea elobjeto especificado.
– target(tipo o identificador): objeto en el que se está llamando al método
• Pointcuts basados en los argumentos– Capturan los jointpoints basándose en los tipos de los
argumentos: args(tipo o identificador)– args(String, .., int)– args(RemoteException)
• Pointcut: condicionales– if(EventQueue.isDispatchThread())
Conceptos básicos : PointcutEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
68
• Ejemplos:pointcut coordChanges(Point p, int newVal):
(set(int Point.x) || set(int Point.y)) && target(p) && args(newVal);
-------------------------------------------pointcut move(FigureElement figElt):
target(figElt) && (call(void Line.setP1(Point)) || call(void Line.setP2(Point)) ||call(void Point.setX(int)) ||call(void Point.setY(int)));
pointcut topLevelMove(FigureElement figElt):move(figElt) &&
!cflowbelow(move(FigureElement));
Conceptos básicos : PointcutEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
69
• Advices– Especifican el código a ejecutar cuando se alcanza
determinado pointcut– AspectJ proporciona 3 modos de ligar un advice con un
jointpoint: before, after y around– Before: se ejecuta antes del jointpoint– After: Se ejecuta después del jointpoint– Around: Rodea la ejecución del jointpoint. Tiene la habilidad
de saltarse la ejecución, continuar la ejecución original o causar una excepción.
Conceptos básicos: AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
70
• Ejemplo:before() : call(public * MyClass.*(..)) {
System.out.println(“Before: “ + thisJointPoint + “ “ + System.currentTimeMillis());}
after() : call(public * MyClass.*(..)) {System.out.println(“After: “ + thisJointPoint + “ “ + System.currentTimeMillis());}
before() : move () {System.out.println(“move”); }
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
71
Cajero Cuenta BDdebit()
getBalance()
query()
setBalance()
update()
return()
return()
return()
before(): call(* Account.debit(..))
before(): execution(* Account.debit(..))
after(): execution(* Account.debit(..))after():
call(* Account.debit(..))
around(): call(* Account.debit(..))
around(): execution(* Account.debit(..))
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
72
• Advices: Anatomía1. Declaración del advice: Especifica cuándo se ejecuta el
advice en relación al jointpoint capturado (antes, después o alrededor) y la información de contexto disponible para el cuerpo como el objeto en ejecución, argumentos, etc.
2. Especificación del pointcut: El advice se ejecuta siempre y cuando se alcance un jointpoint que se corresponda con este pointcut.
3. Cuerpo del advice: Acciones a ejecutar.
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
73
• Advices: Ejemplopointcut connectionOperation(Connection
connection): call(* Connection.*(..) throws
SQLException)&& target(connection);before(Connection connection):connectionOperation (connection) {System.out.println("Performing operation on
" + connection);}
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
1
2
3
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
74
• Advices: Anatomía
Object around(Connection connection) throws SQLException
: connectionOperation (connection) {System.out.println("Operation " + thisJoinPoint+ " on " + connection+ " started at "+ System.currentTimeMillis());proceed(connection);System.out.println("Operation " + thisJoinPoint+ " on " + connection+ " completed at "+ System.currentTimeMillis());}
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
1
2
3
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
75
• Advices: Before– Se ejecuta ANTES de la ejecución del jointpoint capturado. – Ejemplo:
before() : call(* Account.*(..)) {... authenticate the user}
– El advice ejecuta la autenticación del usuario ANTES de ejecutar cualquier método de la clase Account
– Si durante la ejecución del before se lanza una excepción, la operación capturada(autenticación) no se ejecutará
– Se utiliza normalmente para ejecutar tareas previas a una operación como aplicación de políticas, logging, autenticación.
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
76
• Advices: After– Se ejecuta DESPUÉS de la ejecución del jointpoint capturado. – After con retorno normal. Sólo tras la exitosa ejecución del método
after() returning: call(* Account.*(..)) {... Log the successful completion }after() returning (<ReturnType ReturnObject):
call(* Account.*(..)) {... Log the successful completion }• Se ejecuta si la llamada a cualquier método de Account termina con éxito
– After que lanza una excepciónafter() throwing: call(* Account.*(..)) {... Log the failure }after() throwing (<ExceptionType
ExceptionObject): call(* Account.*(..)) { ... Log the successful completion }
• Se ejecuta si la llamada a cualquier método de Account termina con éxito
– De un modo o del otro. Ejemplo:after() : call(* Account.*(..)) {... Log the return from operation}
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
77
• Ejemplo: MoveTracking v1
aspect MoveTracking {private boolean flag = false;public boolean testAndClear() {
boolean result = flag;flag = false;return result;
}
pointcut move(): call(void Line.setP1(Point)) || call(void Line.setP2(Point)) ||call(void Point.setX(int)) ||call(void Point.setY(int));
after() returning: move() {flag = true;
}}
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
78
class Line {private Point p1, p2;
Point getP1() { return p1; }Point getP2() { return p2; }
void setP1(Point p1) {this.p1 = p1;MoveTracking.setFlag();
}void setP2(Point p2) {this.p2 = p2;MoveTracking.setFlag();
}}
class MoveTracking {private static boolean flag = false;
public static void setFlag() {flag = true;
}
public static boolean testAndClear() {
boolean result = flag;flag = false;return result;
}}
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
• Por cierto, sin aspectos sería:
• Diferencias• Las llamadas para activar el flag están enredadas por el
código• “lo que está pasando” es menos explícito
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
79
• Advices: Around– Intercepta el jointpoint.– Puede saltarse la ejecución del jointpoint o ejecutarlo con los
mismos o distintos argumentos– Puede ejecutar el jointpoint capturado múltiples veces cada
vez con distintos argumentos.– Para ejecutar la operación del jointpoint: proceed()
• Si no se usa, el jointpoint capturado no se ejecutará.• Cuando se usa, puedes pasarle el contexto recopilado por el
advice a la operación. O puedes pasarle otro diferente (mismo número, mismo tipo)
• Retorna el mismo valor que la operación capturada.– Usos
• Ejecutar acciones adicionales a la ejecución de un jointpoint• Saltar la operación original y ejecutar alguna otra en su lugar• Rodear la ejecución con un bloque try...catch para llevar a cabo
una política de gestión de excepciones– Ejemplo
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
80
• Advices: Around– Ejemplovoid around(Account account, float amount) throws
InsufficientBalanceException :call(* Account.debit(float) throws
InsufficientBalanceException)&& target(account) && args(amount) {try { proceed(account, amount);
} catch (InsufficientBalanceException ex) {... overdraft protection logic }}– El jointpoint es la llamada a debit– Capturamos el objeto Account y amount mediante target y
args– Rodeamos la ejecución (proceed) con un bloque try ..catch– Resultado: Cuando se ejecuta el advice, él a su vez ejecuta
el método capturado. Si se lanza una excepción, el bloque catch ejecuta la lógica de protección usando el contexto capturado por target y args.
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
81
• Paso de parámetros desde el jointpoint al advice– A veces, el advice necesita acceder a datos del jointpoint:
Contexto– El pointcut necesita exponer el contexto y pasarlo al advice:
this(ident), target(ident), args(ident)• Captura los objetos y les asigna un identificador• En la declaración, el advice utiliza los identificadores como si
fuesen argumentos de un método
Conceptos básicos : Paso de parámetrosEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
82
• Paso de parámetros desde el jointpoint al advice– Si se usan pointcuts con nombre, estos a su vez, deben
recolectar el contexto y pasárselo al advice.
Conceptos básicos : Paso de parámetrosEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
83
• Paso de parámetros desde el jointpoint al advice– Izquierda : Derecha
– Desde los constructores a los pointcut designados por el usuario
pointcut moves(Line l): target(l) &&
(call(void Line.setP1(Point)) || call(void Line.setP2(Point)));
– Del pointcut al adviceafter(Line line): move(line) {
<line is bound to the line>}
Conceptos básicos : Paso de parámetrosEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Parámetros del pointcut
variable en lugar de tipo
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
84
• Ejemplo
• Ejemplo
Conceptos básicos : Paso de parámetrosEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
85
• Retorno de valores desde el advice– Todo advice de tipo around debe declarar un valor de retorno
(puede ser void). Suele ser habitual declararlo del mismo tipo que los jointpoint que se captura.
– Al invocar a proceed() se obtiene el valor que devuelve por el jointpoint. A menos que necesites manipularlo, el advice retornará ese valor
– Si no invocas a proceed(), tienes que arreglártelas de algún modo para retornar un valor del tipo declarado.
– Si tienes varios tipos de retorno, usa Object.
Conceptos básicos : Retorno de valoresEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
86
• Ejemplosaspect MoveTracking {
private Set movees = new HashSet();public Set getMovees() {
Set result = movees;movees = new HashSet();return result;
}
pointcut move(FigureElement figElt):target(figElt) && (call(void Line.setP1(Point)) || call(void Line.setP2(Point)) ||call(void Point.setX(int)) ||call(void Point.setY(int)));
after(FigureElement fe) returning: move(fe) {movees.add(fe);
}}
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
87
• Que por cierto, sin aspectos sería
Conceptos básicos : AdviceEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
class Line {private Point p1, p2;
Point getP1() { return p1; }Point getP2() { return p2; }
void setP1(Point p1) {this.p1 = p1;MoveTracking.collectOne(this);
}void setP2(Point p2) {this.p2 = p2;MoveTracking.collectOne(this);
}}
class Point {private int x = 0, y = 0;
int getX() { return x; }int getY() { return y; }
void setX(int x) { this.x = x;MoveTracking.collectOne(this);
}void setY(int y) { this.y = y;MoveTracking.collectOne(this);
}}
class MoveTracking {private static Set movees = new HashSet();
public static void collectOne(Object o) {movees.add(o);
}
public static Set getmovees() {Set result = movees;movees = new HashSet();return result;
} }
• Engorroso– Cambios en las tres clases– Hay que llevar registro de los
llamadores• Cambio del nombre de método• Añadir argumento
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
88
• Aspect– El concepto aspect actúa como unidad de modularización,
exactamente igual que las clases en Java.• Diferencia: no se crean objetos aspect
– Un aspecto aúna pointcuts y advices– Ejemplo
aspect Logging {OutputStream logStream = System.err;before() : move() {
logStream.println(“move”);}
}
Conceptos básicos : AspectEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
89
Conceptos básicos : AspectEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller pointcut move():
call(void Line.setP1(Point)) || call(void Line.setP2(Point));
after() returning: move() {<code here runs after each move>
}
un aspecto define una clase especial que
puede interferir en otras clases
aspect History Updating {
}
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
90
public class HelloWorld {public static void say(String message) {
System.out.println(message);}public static void sayToPerson(String message, String Name) {
System.out.println(name + “ , “ + message);}
}
public aspect MannersAspect {pointcut callSayMessage() : call(public static void HelloWorld.say*(..));before() : callSayMessage() {System.out.println(“Buenos días”);}
after() : callSayMessage() {System.out.println(“Adiós”);}
}
HelloWorldEl lenguaje AspectJ
Esquema • Introducción • La POA• Lenguajes de POA• El Lenguaje AspectJ– Visión general– Conceptos básicos – HelloWorld• Ejemplos• Taller
Tabla de contenidos
• Introducción• La programación orientada a aspectos• Lenguajes de Programación orientados a aspectos• El lenguaje AspectJ• Ejemplos• Taller
91
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
92
• A la hora de depurar un sistema, los programadores invierten un considerable esfuerzo en determinar un buen conjunto de puntos de traza cuando se busca un particular tipo de problema.
• Cuando termina la depuración, es necesario perder todo el esfuerzo borrando las sentencias de trazo del código.
• La alternativa de comentarlas, genera un código feo y puede causar que se mezclen sentencias de depuración de un tipo con sentencias de depuración de otro tipo.
• Con AspectJ es fácil tanto preservar el trabajo de diseñar un buen conjunto de puntos de traza como deshabilitar la traza si no se está utilizando.
• Se entiende la traza como un aspecto ortogonal que se puede conectar y desconectar independientemente del resto del sistema.
• Para ello, se escribe un aspecto específicamente para traza y seomite su compilación cuando no es necesario.
TracingEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing– Profiling y Logging• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
93
TraceSupport
class Point {void set(int x, int y) {
TraceSupport.traceEntry(“Point.set”);_x = x; _y = y;TraceSupport.traceExit(“Point.set”);
}}
class TraceSupport {static int TRACELEVEL = 0;static protected PrintStream stream = null;static protected int callDepth = -1;
static void init(PrintStream _s) {stream=_s;}
static void traceEntry(String str) {if (TRACELEVEL == 0) return;callDepth++;printEntering(str);
}static void traceExit(String str) { if (TRACELEVEL == 0) return;callDepth--;printExiting(str);
}}
Tracing SIN ASPECTOSEjemplos
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
94
• Conectar (plug) la traza en el sistema– Exponer join points y usar advices muy simples
• Aspecto con posibilidad de ser desconectado unpluggable– La funcionalidad del programa no se ve afectada por el
aspecto
• usa tanto aspectos como objectos
Tracing como un aspectoEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing– Profiling y Logging• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
95
Tracing como un aspectoEjemplos
aspect TraceMyClasses {
pointcut tracedMethod():within(com.bigboxco.boxes.*) &&execution(* *(..));
before(): tracedMethod() {TraceSupport.traceEntry(
thisJoinPoint.getSignature());}after(): tracedMethod() {
TraceSupport.traceExit(thisJoinPoint.getSignature());
}}
TraceSupport
Todos los módulos del sistema utilizan la utilidad de traza de modo consistente: al entrar y salir de los métodos
Esta línea muestra la interacción con la utilidad de traza
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
96
Los workers necesitan conocer al llamador:• Capacidades• Saber a quién cargarlos• Personalizar el resultado
caller1
caller2
Service
worker 1 worker 3worker 2
Paso de contextoEjemplos
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
97
caller1
caller2
Service
worker 1 worker 3worker 2
Ejemplos
Paso de contexto
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
98
pointcut invocations(Caller c):target(c) && call(void Service.doService(String));
Ejemplos
Paso de contexto
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
99
pointcut invocations(Caller c):target(c) && call(void Service.doService(String));
pointcut workPoints(Worker w):target(w) && call(void Worker.doTask(Task));
Ejemplos
Paso de contexto
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
100
pointcut invocations(Caller c):target(c) && call(void Service.doService(String));
pointcut workPoints(Worker w):target(w) && call(void Worker.doTask(Task));
pointcut perCallerWork(Caller c, Worker w):cflow(invocations(c)) && workPoints(w);
Ejemplos
Paso de contexto
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
101
abstract aspect CapabilityChecking {
pointcut invocations(Caller c):this(c) && call(void Service.doService(String));
pointcut workPoints(Worker w):target(w) && call(void Worker.doTask(Task));
pointcut perCallerWork(Caller c, Worker w):cflow(invocations(c)) && workPoints(w);
before (Caller c, Worker w): perCallerWork(c, w) { w.checkCapabilities(c);
}}
Ejemplos
Paso de contexto
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
102
• Introducir errores y advertencias en tiempo de compilación– Permite implantar un comportamiento similar a las directivas
#error y #warning– declare error : <pointcut> : <message>;
• Cuando el compilador detecta la presencia de un jointpoint que se corresponde con el del argumento, emite un error, imprime el mensaje y aborta la compilación
– declare warning : <pointcut> : <message>;– Usos: obligar al cumplimiento de ciertas normas
• Prohibir llamadas a ciertos métodos no soportados
Excepción RMIEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
103
• Reacción del cliente a los fallos: abortar o intentar otro servidor
Excepción RMIEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
104
Excepción RMI: Diseño de un TimeServerEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
105
Excepción RMI: TimeServiceEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
public interface TimeService extends Remote {
/*** What's the time?*/
public Date getTime() throws RemoteException;
/*** Get the name of the server*/
public String getName() throws RemoteException;
/*** Exported base name for the service*/
public static final String nameBase = "TimeService";}
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
106
Excepción RMI: TimeServiceEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
public class TimeServer extends UnicastRemoteObject implements TimeService {
/*** The remotely accessible methods*/
public Date getTime() throws RemoteException {return new Date();}public String getName() throws RemoteException {return toString();}/*** Make a new server object and register it*/
public static void main(String[] args) {TimeServer ts = new TimeServer();Naming.bind(TimeService.nameBase, ts);
}/*** Exception pointcuts. Code is not complete without advice on them.*/
pointcut create(): within(TimeServer) && call(TimeServer.new());
pointcut bind(): within(TimeServer) && call(void Naming.bind(String,..));pointcut bindName(String name): args(name, ..) && bind();
}
No se captura ninguna
excepción aquí, pero se
registra
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
107
Excepción RMI: AbortMyServerEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
aspect AbortMyServer {TimeServer around(): TimeServer.create() {TimeServer result = null;try {result = proceed();
} catch (RemoteException e){System.out.println("TimeServer err: " + e.getMessage());System.exit(2);
}return result;
} declare soft: RemoteException: TimeServer.create();
void around(String name): TimeServer.bindName(name) {try {proceed(name);System.out.println("TimeServer: bound name.");
} catch (Exception e) {System.err.println("TimeServer: error " + e);System.exit(1);
}}declare soft: Exception: TimeServer.bind();
}
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
108
Excepción RMI: RetryMyServerEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
aspect RetryMyServer {TimeServer around(): TimeServer.create() {TimeServer result = null;try { result = proceed(); } catch (RemoteException e){
System.out.println("TimeServer error."); e.printStackTrace();}return result;
}declare soft: RemoteException: TimeServer.create();
void around(String name): TimeServer.bindName(name) {for (int tries = 0; tries < 3; tries++) {
try {proceed(name + tries);System.out.println("TimeServer: Name bound in registry.");return;
} catch (AlreadyBoundException e) {System.err.println("TimeServer: name already bound");
}System.err.println("TimeServer: Giving up."); System.exit(1);
}declare soft: Exception: TimeServer.bind();
}
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
109
Excepción RMI: ClientEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
public class Client {TimeService server = null;/*** Get a server and ask it the time occasionally*/void run() {server = (TimeService)Naming.lookup(TimeService.nameBase); System.out.println("\nRemote Server=" + server.getName() + "\n\n"); while (true) {System.out.println("Time: " + server.getTime()); pause();
}}/*** Exception pointcuts. Code is not complete without advice on them.*/pointcut setup(): call(Remote Naming.lookup(..));pointcut setupClient(Client c): this(c) && setup();
pointcut serve(): call(* TimeService.*(..));pointcut serveClient(Client c, TimeService ts): this(c) && target(ts) && serve();
… other methods …}
De nuevo, aquí no se captura ninguna
excepción
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
110
Excepción RMI: AbortMyClientEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
aspect AbortMyClient {Remote around(Client c): Client.setupClient(c) {Remote result = null;try {
result = proceed(c);} catch (Exception e) {
System.out.println("Client: No server. Aborting.");System.exit(0);
}return result;
}declare soft: Exception: Client.setup();
Object around(Client c, TimeService ts): Client.serveClient(c, ts) {Object result = null;try {
result = proceed(c, ts);} catch (RemoteException e) {
System.out.println("Client: Remote Exception. Aborting.");System.exit(0);
}return result;
} declare soft: RemoteException: Client.serve();
}
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
111
Excepción RMI: RetryMyClientEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
aspect RetryMyClient {
Remote around(Client c): Client.setupClient(c) {Remote result = null;try { result = proceed(c);}catch (NotBoundException e) {
System.out.println("Client: Trying alternative name...");result = findNewServer(TimeService.nameBase, c.server, 3);if (result == null) System.exit(1); /* No server found */
} catch (Exception e2) { System.exit(2); }return result;
}declare soft: Exception: Client.setup();
Object around(Client c, TimeService ts): Client.serveClient(c,ts) {try { return proceed(c,ts); }catch (RemoteException e) { /* Ignore and try other servers */ }c.server = findNewServer(TimeService.nameBase, c.server, 3);if (c.server == null) System.exit(1); /* No server found */try { return thisJoinPoint.runNext(c, c.server); }catch (RemoteException e2) { System.exit(2); } return null;
}declare soft: RemoteException: Client.serve();
static TimeService findNewServer(String baseName, Object currentServer, int nservers) { … }
}
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
112
Excepción RMI: PluginEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
• Modo abort :
• Modo retry :
• Cambio entre diferentes modos de gestión de fallos sin editar el código
• No es necesario subclases ni delegación• Gestores de fallos reusables
ajc Client.java TimeServer_Stub.java AbortMyClient.java
ajc Client.java TimeServer_Stub.java RetryMyClient.java
Sistemas adaptables, reflectivos y separación de aspectosLourdes Tajes Martínez- 2003
113
Excepción RMI: EjerciciosEjemplos
Esquema • Introducción • La POA• Lenguajes de POA• El lenguaje AspectJ• Ejemplos– Tracing–Excepción RMI• Taller
• Write another exception handler that, on exceptions, gives up the remote mode and instantiates a local TimeServer.
• How would this client look like if the exception handling were not designed with aspects? Can you come up with a flexible OO design for easily switching between exception handlers?
• Compare the design of exception handlers with aspects vs. with your OO design