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.response;
015:
016: import java.io.IOException;
017: import java.io.Writer;
018: import java.util.ArrayList;
019: import java.util.Iterator;
020: import java.util.LinkedList;
021: import java.util.Map;
022: import org.itsnat.impl.core.*;
023: import org.itsnat.impl.core.client.ClientDocumentInvitedRemoteCtrlImpl;
024: import org.itsnat.impl.core.event.client2serv.RemoteControlEventImpl;
025: import org.itsnat.impl.core.js.domrender.node.JSNodeRenderImpl;
026: import org.w3c.dom.Node;
027: import org.w3c.dom.NodeList;
028: import org.w3c.dom.html.HTMLDocument;
029: import org.w3c.dom.html.HTMLTextAreaElement;
030:
031: /**
032: *
033: * @author jmarranz
034: */
035: public class ResponseRemoteControlLoadDocImpl extends
036: ResponseRemoteControlImpl {
037:
038: /**
039: * Creates a new instance of ResponseRemoteControlLoadDocImpl
040: */
041: public ResponseRemoteControlLoadDocImpl(
042: RemoteControlEventImpl requestEvent,
043: ItsNatServletResponseImpl itsNatResponse) {
044: super (requestEvent, itsNatResponse);
045: }
046:
047: protected boolean isJavaScript() {
048: return false;
049: }
050:
051: protected void process(Writer out) throws IOException {
052: // Caso RemoteControlEvent.LOAD:
053: // Aunque sea en carga, se procesa como si fuera un evento.
054:
055: ItsNatDocumentImpl itsNatDoc = requestEvent
056: .getItsNatDocumentImpl();
057: itsNatDoc.dispatchRemoteControlListeners(requestEvent);
058:
059: sendLoadCode(out);
060: }
061:
062: protected void sendLoadCode(Writer out) throws IOException {
063: //ItsNatServletRequestImpl itsNatRequest = itsNatResponse.getItsNatServletRequestImpl();
064: //ClientDocumentInvitedRemoteCtrlImpl observer = (ClientDocumentInvitedRemoteCtrlImpl)itsNatRequest.getClientDocumentImpl();
065: ItsNatDocumentImpl itsNatDoc = itsNatResponse
066: .getItsNatDocumentImpl();
067:
068: String docCode = itsNatDoc.serializeDocument();
069:
070: String code = getRemoteControlLoadCode();
071:
072: // En el caso de control remoto no cargamos el código del script via URL
073: // por una parte porque es muy poco y la razón estética (un <script> al final enorme)
074: // pierde pero, y por otro porque no está implementado sólo en el modo normal se permite
075: boolean loadScriptInline = itsNatDoc.isLoadScriptInline();
076: ResponseLoadHTMLDocSharedImpl.addScriptToLoadedDocument(
077: docCode, code, out, loadScriptInline, true,
078: itsNatResponse);
079: }
080:
081: public String getRemoteControlLoadCode() {
082: ItsNatServletRequestImpl itsNatRequest = itsNatResponse
083: .getItsNatServletRequestImpl();
084:
085: ClientDocumentInvitedRemoteCtrlImpl observer = (ClientDocumentInvitedRemoteCtrlImpl) itsNatRequest
086: .getClientDocumentImpl();
087: String observerId = observer.getId();
088: int syncMode = observer.getSyncMode();
089:
090: StringBuffer code = new StringBuffer();
091:
092: code.append("\n");
093: code.append("function ItsNatRemCtrlUnload() \n");
094: code.append("{ \n");
095: code.append(" itsNatDoc.sendRemCtrlUnload(\"" + observerId
096: + "\"," + syncMode + "); \n");
097: code.append("} \n");
098: code.append("\n");
099: code
100: .append("itsNatDoc.addRemCtrlUnloadListener(ItsNatRemCtrlUnload); \n");
101:
102: code.append(observer.getCodeToSendAndReset()); // El código específico de timers o comet
103:
104: ItsNatDocumentImpl itsNatDoc = itsNatResponse
105: .getItsNatDocumentImpl();
106: NodeCache nodeCache = itsNatDoc.getNodeCache();
107: if ((nodeCache != null) && !nodeCache.isEmpty()) {
108: ArrayList cacheCopy = nodeCache.getOrderedByHeight();
109: for (int h = 0; h < cacheCopy.size(); h++) {
110: LinkedList sameH = (LinkedList) cacheCopy.get(h);
111: if (sameH == null)
112: continue;
113: for (Iterator it = sameH.iterator(); it.hasNext();) {
114: Map.Entry entry = (Map.Entry) it.next();
115: Node node = (Node) entry.getKey();
116: String id = (String) entry.getValue();
117:
118: NodeLocation nodeLoc = itsNatDoc
119: .getNodeLocationUsingCache(node, id,
120: nodeCache);
121: code.append(JSNodeRenderImpl
122: .addNodeToCache(nodeLoc));
123: }
124: }
125: }
126:
127: if (itsNatDoc.isHTMLorXHTML()) {
128: HTMLDocument doc = (HTMLDocument) itsNatDoc.getDocument();
129: NodeList textAreaList = doc
130: .getElementsByTagName("textarea");
131: for (int i = 0; i < textAreaList.getLength(); i++) {
132: // Esto es necesario pues el contenido de nodos del textarea no cambia
133: // al cambiar el control del original y
134: // el valor del atributo value (el que está en el DOM en el servidor y el único que conoce el valor actual del control)
135: // no sirve para imponer el valor en el control en un TextArea
136: // porque el que verdaderamente cambia el valor es la propiedad no el atributo,
137: // debe definirse la propiedad value explícitamente (propiedad value y atributo value no son lo mismo)
138: HTMLTextAreaElement textArea = (HTMLTextAreaElement) textAreaList
139: .item(i);
140: code.append(JSNodeRenderImpl.getSetNodePropertyCode(
141: textArea, "value", textArea.getValue(),
142: itsNatDoc));
143: }
144: }
145:
146: return code.toString();
147: }
148: }
|