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;