001: /*
002: ItsNat Java Web Application Framework
003: Copyright (C) 2007 Innowhere Software Services S.L., Spanish Company
004: Author: Jose Maria Arranz Santamaria
005:
006: This program is free software: you can redistribute it and/or modify
007: it under the terms of the GNU Affero General Public License as published by
008: the Free Software Foundation, either version 3 of the License, or
009: (at your option) any later version. See the GNU Affero General Public
010: License for more details. See the copy of the GNU Affero General Public License
011: included in this program. If not, see <http://www.gnu.org/licenses/>.
012: */
013:
014: package org.itsnat.impl.core;
015:
016: import org.itsnat.impl.core.domutil.ItsNatDOMUtilInternal;
017: import org.w3c.dom.Document;
018: import org.w3c.dom.DocumentFragment;
019: import org.w3c.dom.Element;
020: import org.w3c.dom.Node;
021:
022: /**
023: *
024: * @author jmarranz
025: */
026: public abstract class DocFragmentTemplateVersionImpl extends
027: MarkupTemplateVersionImpl {
028:
029: /**
030: * Creates a new instance of DocFragmentTemplateVersionImpl
031: */
032: public DocFragmentTemplateVersionImpl(
033: DocFragmentTemplateImpl docTemplate, long timeStamp) {
034: super (docTemplate, timeStamp);
035:
036: // Los fragmentos tienen una técnica de cache diferente a la de un Document
037: // porque los fragmentos están diseñados para ser insertados en otros documentos
038: // (el mismo fragmento en varios documentos) y una vez insertado como DOM
039: // se pierde (o no conviene) el DocFragmentTemplateVersionImpl que lo originó, por lo que
040: // guardar aquí un repositorio de nodos serializados cacheados no nos sirve.
041: // El objetivo es reducir el footprint aunque no podamos por unicidad (via repositorio global)
042: // al menos lo conseguiremos por aplanación del DOM en texto evitando así que el árbol DOM esté instanciado
043: // y peor aún repetido sistemáticamente al clonar.
044: // Lo conseguimos serializando el nodo conviértiéndolo en nodo de texto y poniéndole un prefijo/sufijo
045: // tipo ${prefijo} ... ${sufijo} para detectar que no es texto normal sino HTML, marcas que han de eliminarse
046: // en la serialización final. Sólo cachearemos Element pues con los Text (o de texto en general)
047: // es absurdo pues no ganamos absolutamente nada.
048: // Cachearemos los elementos hijos del Element "cacheable" pues de esta manera
049: // no cambiamos los elementos hijos inmediatos del DocumentFragment
050:
051: if (isOnLoadCacheStaticNodes())
052: doCacheDocument();
053: }
054:
055: public DocumentFragment loadDocumentFragment(
056: DocumentFragment cachedDocFrament,
057: MarkupContainerImpl target) {
058: // Es una falsa carga, es un clonado pues importNode hace un clonado (está documentado)
059: // no hace falta por tanto otro cloneNode(true)
060: // En principio el clonado yo creo admite multihilo
061: target.addMarkupTemplateVersionIfCaching(this );
062:
063: Document docTarget = target.getDocument();
064:
065: return (DocumentFragment) docTarget.importNode(
066: cachedDocFrament, true);
067: }
068:
069: public abstract DocumentFragment loadDocumentFragment(
070: MarkupContainerImpl target);
071:
072: public DocumentFragment extractChildrenToDocFragment(Element parent) {
073: // El copiar nodos a un DocumentFragment conlleva inevitablemente
074: // quitarlos del nodo padre, por tanto HAY QUE RECORDAR que "parent"
075: // ha quedado vacío.
076:
077: return ItsNatDOMUtilInternal
078: .extractChildrenToDocFragment(parent);
079: }
080:
081: public void inspectChildNodesToCache(Element node) {
082: Node child = node.getFirstChild();
083: while (child != null) {
084: inspectNodeToCache(child);
085:
086: child = child.getNextSibling();
087: }
088: }
089:
090: /*
091: public void inspectNodesToCache(DocumentFragment cachedDocFragment)
092: {
093: Node child = cachedDocFragment.getFirstChild();
094: while(child != null)
095: {
096: inspectNodeToCache(child);
097:
098: child = child.getNextSibling();
099: }
100: }
101: */
102: }
|