{
// Copiamos la cach� del cliente propietarios pues contiene los nodos m�s frecuentemente
// usados, as� aceleramos el c�lculo de paths para el observador.
ItsNatStfulDocumentImpl itsNatDoc = clientAttached.getItsNatStfulDocument();
ClientDocumentStfulOwnerImpl clientDocOwner = itsNatDoc.getClientDocumentStfulOwner();
NodeCacheRegistryImpl nodeCacheOwner = clientDocOwner.getNodeCacheRegistry();
if ((nodeCacheOwner == null) || nodeCacheOwner.isEmpty())
return;
StringBuilder code = new StringBuilder();
NodeCacheRegistryImpl nodeCacheObserver = clientAttached.getNodeCacheRegistry(); // DEBE existir
if (!nodeCacheObserver.isEmpty()) throw new ItsNatException("INTERNAL ERROR"); // Debe estar "virgen" no sea que hayamos ya antes cacheado nodos en el observador y estar�amos cacheando dos veces aunque sea con el mismo id lo cual no est� permitido, provocamos error antes.
ArrayList<LinkedList<Map.Entry<Node,String>>> cacheCopy = nodeCacheOwner.getOrderedByHeight();
boolean cacheParentIfPossible = false; // De esta manera evitamos un cacheado indirecto, el objetivo de este c�digo es copiar una cach� a otra, exactamente los mismos nodos
for(int h = 0; h < cacheCopy.size(); h++)
{
LinkedList<Map.Entry<Node,String>> sameH = cacheCopy.get(h);
if (sameH == null) continue;
for(Map.Entry<Node,String> entry : sameH)
{
Node node = entry.getKey();
String id = entry.getValue();
// Los ids de los nodos son generados por el ItsNatDocumentImpl
// por lo que pueden compartirse entre cach�s de clientes.
if (isIgnoredNodeForCaching(node)) continue;
nodeCacheObserver.addNode(node,id); // node no puede ser nulo
NodeLocationWithParentImpl nodeLoc = NodeLocationWithParentImpl.getNodeLocationWithParentUsingCache(node,id,cacheParentIfPossible,nodeCacheObserver);
if (!nodeLoc.isJustCached())
throw new ItsNatException("INTERNAL ERROR");
code.append( JSRenderNodeImpl.addNodeToCache(nodeLoc) );