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.core.ItsNatDOMException;
017: import org.itsnat.impl.core.dom.render.DOMRenderImpl;
018: import java.io.IOException;
019: import java.io.Writer;
020: import java.text.DateFormat;
021: import java.text.NumberFormat;
022: import org.itsnat.core.ItsNatDocument;
023: import org.itsnat.core.ItsNatException;
024: import org.w3c.dom.Document;
025: import org.w3c.dom.DocumentFragment;
026:
027: /**
028: Si fastLoadMode es true no se procesan los mutation events en carga haciendo que el código JavaScript de carga sea mucho menor
029: serializándose el documento tras el proceso del usuario en carga.
030: El inconveniente es que durante la carga no se pueden usar nodos que al final de la carga
031: han sido eliminados o ha cambiado su path, pues el JavaScript se ejecuta actúa sobre el documento
032: generado tras el proceso de carga.
033: Si fastLoadMode es false se envía serializado al cliente la plantilla original
034: y se envía como JavaScript todas las mutaciones del documento, elimina la
035: restricción considerada anteriormente.
036: El inconveniente es que se genera mucho JavaScript (más tráfico) y la ejecución del código tarda mucho
037: (el JavaScript es muy lento).
038: Es preferible el modo fastLoadMode = true si la aplicación lo permite
039:
040: * @author jmarranz
041: */
042: public abstract class DocumentTemplateVersionImpl extends
043: MarkupTemplateVersionImpl {
044: protected DOMRenderImpl docRender;
045:
046: /**
047: * Creates a new instance of DocumentTemplateVersionImpl
048: */
049: public DocumentTemplateVersionImpl(
050: DocumentTemplateImpl docTemplate, long timeStamp) {
051: super (docTemplate, timeStamp);
052:
053: if (isReferrerEnabled() && !isAJAXEnabled())
054: throw new ItsNatException(
055: "Referrer feature needs AJAX enabled"); // Dará error la primera vez que se cargue un documento, mientras tanto ambos parámetros pueden ser incorrectos a nivel de DocumentTemplateImpl
056:
057: if (!isScriptingEnabled()) {
058: if (isAJAXEnabled())
059: throw new ItsNatException(
060: "AJAX cannot be enabled whether scripting is disabled"); // Dará error la primera vez que se cargue un documento, mientras tanto los parámetros pueden ser incorrectos a nivel de DocumentTemplateImpl
061: if (!isFastLoadMode())
062: throw new ItsNatException(
063: "Fast load mode must be enabled if scripting is disabled"); // Dará error la primera vez que se cargue un documento, mientras tanto los parámetros pueden ser incorrectos a nivel de DocumentTemplateImpl
064: }
065:
066: // Se supone que mime y encoding no cambian
067: this .docRender = DOMRenderImpl.getDOMRender(templateDoc,
068: getMIME(), getEncoding());
069:
070: preCacheDocument();
071: if (isOnLoadCacheStaticNodes())
072: doCacheDocument(); // El cacheado se produce únicamente en el proceso de carga
073: }
074:
075: public DOMRenderImpl getDocumentRender() {
076: return docRender;
077: }
078:
079: protected abstract void preCacheDocument();
080:
081: public boolean isFastLoadMode() {
082: return getDocumentTemplate().isFastLoadMode();
083: }
084:
085: public String getFrameworkScriptFilesBasePath() {
086: return getDocumentTemplate().getFrameworkScriptFilesBasePath();
087: }
088:
089: public boolean isAddFrameworkScriptFiles() {
090: return getDocumentTemplate().isAddFrameworkScriptFiles();
091: }
092:
093: public boolean isDebugMode() {
094: return getDocumentTemplate().isDebugMode();
095: }
096:
097: public int getClientErrorMode() {
098: return getDocumentTemplate().getClientErrorMode();
099: }
100:
101: public int getDefaultSyncMode() {
102: return getDocumentTemplate().getDefaultSyncMode();
103: }
104:
105: public long getAJAXTimeout() {
106: return getDocumentTemplate().getAJAXTimeout();
107: }
108:
109: public int getUseGZip() {
110: return getDocumentTemplate().getUseGZip();
111: }
112:
113: public boolean isNodeCacheEnabled() {
114: return getDocumentTemplate().isNodeCacheEnabled();
115: }
116:
117: public boolean isAutoBuildComponents() {
118: return getDocumentTemplate().isAutoBuildComponents();
119: }
120:
121: public boolean isLoadScriptInline() {
122: return getDocumentTemplate().isLoadScriptInline();
123: }
124:
125: public boolean isReferrerPushEnabled() {
126: return getDocumentTemplate().isReferrerPushEnabled();
127: }
128:
129: public ItsNatDocumentImpl loadItsNatDocument(
130: ItsNatSessionImpl session) {
131: Document doc = loadDocument();
132: return createItsNatDocument(doc, session);
133: }
134:
135: public abstract ItsNatDocumentImpl createItsNatDocument(
136: Document doc, ItsNatSessionImpl session);
137:
138: public Document loadDocument() {
139: // Es una falsa carga, es un clonado
140: // En principio el clonado yo creo admite multihilo
141: return (Document) templateDoc.cloneNode(true);
142: }
143:
144: public String serializeTemplateDocument() {
145: return serializeDocument(templateDoc, docRender);
146: }
147:
148: public DocumentTemplateImpl getDocumentTemplate() {
149: return (DocumentTemplateImpl) markupTemplate;
150: }
151:
152: public DateFormat getDefaultDateFormat() {
153: return getDocumentTemplate().getDefaultDateFormat();
154: }
155:
156: public NumberFormat getDefaultNumberFormat() {
157: return getDocumentTemplate().getDefaultNumberFormat();
158: }
159:
160: public long getEventDispatcherMaxWait() {
161: return getDocumentTemplate().getEventDispatcherMaxWait();
162: }
163:
164: public boolean isReferrerEnabled() {
165: return getDocumentTemplate().isReferrerEnabled();
166: }
167:
168: public boolean isAJAXEnabled() {
169: return getDocumentTemplate().isAJAXEnabled();
170: }
171:
172: public boolean isScriptingEnabled() {
173: return getDocumentTemplate().isScriptingEnabled();
174: }
175:
176: public boolean isAutoCleanEventListeners() {
177: return getDocumentTemplate().isAutoCleanEventListeners();
178: }
179:
180: public boolean isUsePatternMarkupToRender() {
181: return getDocumentTemplate().isUsePatternMarkupToRender();
182: }
183:
184: public void setUsePatternMarkupToRender(
185: boolean usePatternMarkupToRender) {
186: getDocumentTemplate().setUsePatternMarkupToRender(
187: usePatternMarkupToRender);
188: }
189:
190: public abstract DocumentFragment loadFragmentFromSource(
191: String source, ItsNatDocument docTarget);
192:
193: }
|