public void processRequest(ClientDocumentStfulImpl clientDocStateless)
{
// Procesamos el request suministrado en un URL
ItsNatStfulDocumentImpl itsNatDoc = null;
final ClientDocumentAttachedClientImpl clientDoc;
// Vemos si este request proviene de un iframe/object/embed/applet
ClientDocumentAttachedClientImpl parentClientDoc = getParentClientDocumentAttachedClient();
if (parentClientDoc != null) // S�
{
ItsNatStfulDocumentImpl parentItsNatDoc = parentClientDoc.getItsNatStfulDocument();
BoundElementDocContainerImpl bindInfo = delegate.getBoundElementDocContainer(parentItsNatDoc);
if (bindInfo == null)
{
processParentElementNotFound();
return;
}
// Obtenemos el documento a trav�s del documento padre en un caso de binding a trav�s de iframe/object
// Si devuelve null es que todav�a no se ha cargado por parte del iframe/object cliente owner.
itsNatDoc = (ItsNatStfulDocumentImpl)bindInfo.getContentItsNatDocument();
// El timeout NO es necesario pasarlo como par�metro pues
// ya lo tenemos aqu�, en el cliente.
long timeout = parentClientDoc.getWaitDocTimeout();
if ((itsNatDoc == null)&&(timeout > 0)) // Podr�amos considerar timeout = -1 como espera indefinida pero es peligroso permitir esto como par�metro "libre". Consideramos el valor 0 como "no esperar"
{
// Probamos en intervalos de tiempo hasta el timeout, pero no
// en intervalos regulares sino en intervalos m�s cortos al ppio
// y m�s largos al final, a partir de un intervalo inicial
// esperar sucesivamente algo m�s (el doble sucesivamente es demasiado r�pido
// al ppio y demasiado lento al final pues es una progresi�n geom�trica):
// t + 2t + 3t + 4t ... = timeout => (1+2+3+4...)t = timeout
// Si an = a1 + (n ? 1)d (donde a1 = 1, d = 1) la suma
// de n t�rminos es: n*(a1+an)/2 => n(1+n)/2
// http://es.wikipedia.org/wiki/Progresi%C3%B3n_aritm%C3%A9tica
// Podemos considerar n=50 intentos => 50(1+50)/2 = 1275
// => 1275 * t = timeout => t = timeout / 1275
long lapse = 0;
long t = timeout / 1275; // Divisi�n entera
if (t == 0) t = 1; // 1 ms el m�nimo
for(int i = 1; i <= 50; i++)
{
try { Thread.sleep(t); } catch(Exception ex) { throw new ItsNatException(ex); }
itsNatDoc = (ItsNatStfulDocumentImpl)bindInfo.getContentItsNatDocument();
if (itsNatDoc != null) break;
lapse = lapse + t;
if (lapse >= timeout) break;
t = ((i+1) * timeout) / 1275;
if (t == 0) t = 1; // 1 ms el m�nimo
}
}
if ((itsNatDoc == null) || itsNatDoc.isInvalid()) // El caso itsNatDoc.isInvalid() devolviendo true es muy raro porque al invalidarse se desregistra de su sesi�n pero puede ocurrir, as� tenemos la seguridad de que la request se realiza sobre un documento v�lido
{
processChildDocInDocContainerNotFound();
return;
}
// Las propiedades de attachment las heredamos del cliente padre
String refreshMethod = parentClientDoc.getRefreshMethod();
int refreshInterval = -1;
if (parentClientDoc instanceof ClientDocumentAttachedClientTimerImpl)
refreshInterval = ((ClientDocumentAttachedClientTimerImpl)parentClientDoc).getRefreshInterval();
int commMode = parentClientDoc.getCommModeDeclared();
long eventTimeout = parentClientDoc.getEventTimeout();
long waitDocTimeout = parentClientDoc.getWaitDocTimeout();
boolean readOnly = parentClientDoc.isReadOnly();
clientDoc = requestAuthorization(itsNatDoc,refreshMethod,refreshInterval,commMode,eventTimeout,waitDocTimeout,readOnly);
}
else
{