Sistemas adaptables, reflectivos y separación de...

113
Sistemas adaptables, reflectivos y separación de aspectos Lourdes Tajes Martínez Octubre - 2003 Programa de Doctorado Departamento de Informática

Transcript of Sistemas adaptables, reflectivos y separación de...

Page 1: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

Sistemas adaptables, reflectivos y separación de aspectos

Lourdes Tajes MartínezOctubre - 2003

Programa de DoctoradoDepartamento de Informática

1

Page 2: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

Tabla de contenidos

• Introducción• La programación orientada a aspectos• Lenguajes de Programación orientados a aspectos• El lenguaje AspectJ• Ejemplos• Taller

2

Page 3: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 4: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 5: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 6: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 7: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 8: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 9: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 10: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 11: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 12: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 13: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 14: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 15: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 16: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 17: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 18: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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 ) ;

}

}

Page 19: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 20: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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 ) ;

}

Page 21: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 22: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 23: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 24: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 25: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 26: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 27: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 28: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 29: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 30: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 31: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 32: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 33: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 34: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 35: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 36: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 37: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 38: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 39: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 40: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 41: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 42: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 43: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 44: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 45: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 46: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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.

Page 47: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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.

Page 48: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 49: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 50: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 51: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 52: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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; }

}

Page 53: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 54: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 55: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 56: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 57: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 58: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 59: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 60: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 61: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 62: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 63: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 64: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 65: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 66: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 67: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 68: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 69: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 70: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 71: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 72: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 73: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 74: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 75: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 76: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 77: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 78: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 79: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 80: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 81: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 82: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 83: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 84: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 85: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 86: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 87: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 88: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 89: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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 {

}

Page 90: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 91: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

Tabla de contenidos

• Introducción• La programación orientada a aspectos• Lenguajes de Programación orientados a aspectos• El lenguaje AspectJ• Ejemplos• Taller

91

Page 92: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 93: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 94: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 95: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 96: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 97: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 98: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 99: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 100: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 101: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 102: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 103: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 104: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 105: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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";}

Page 106: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 107: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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();

}

Page 108: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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();

}

Page 109: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 110: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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();

}

Page 111: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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) { … }

}

Page 112: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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

Page 113: Sistemas adaptables, reflectivos y separación de …di002.edv.uniovi.es/~lourdes/tercerCiclo/POA.pdfSistemas adaptables,reflectivos y separación de aspectos Lourdes Tajes Martínez-

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