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.ItsNatDocument;
017: import org.itsnat.core.ItsNatException;
018: import org.itsnat.core.ItsNatServletRequest;
019: import org.itsnat.core.ItsNatServlet;
020: import org.itsnat.core.ItsNatServletResponse;
021: import org.itsnat.core.ItsNatSession;
022: import org.itsnat.core.ItsNatVariableResolver;
023: import org.itsnat.impl.core.client.ClientDocumentImpl;
024: import org.itsnat.impl.core.request.RequestImpl;
025: import org.itsnat.impl.core.request.RequestNormalEventImpl;
026: import org.itsnat.impl.core.request.RequestNormalLoadDocImpl;
027: import org.itsnat.impl.core.request.RequestRemoteControlEventImpl;
028: import org.itsnat.impl.core.request.RequestRemoteControlLoadDocImpl;
029: import java.io.UnsupportedEncodingException;
030: import javax.servlet.ServletRequest;
031: import org.itsnat.core.ClientDocument;
032: import org.itsnat.impl.core.request.RequestCustomImpl;
033: import org.itsnat.impl.core.request.RequestLoadScriptImpl;
034:
035: /**
036: *
037: * @author jmarranz
038: */
039: public abstract class ItsNatServletRequestImpl extends
040: ItsNatUserDataImpl implements ItsNatServletRequest {
041: protected ItsNatServletImpl itsNatServlet;
042: protected ServletRequest request;
043: protected ItsNatServletResponseImpl itsNatResponse;
044: protected ItsNatDocumentImpl itsNatDoc;
045: protected ClientDocumentImpl clientDoc;
046: protected ItsNatDocumentImpl itsNatDocReferrer;
047: protected ItsNatSessionImpl itsnatSession;
048:
049: /**
050: * Creates a new instance of ItsNatServletRequestImpl
051: */
052: public ItsNatServletRequestImpl(ItsNatServletImpl itsNatServlet,
053: ServletRequest request) {
054: super (false);
055:
056: this .itsNatServlet = itsNatServlet;
057: this .request = request;
058:
059: this .itsnatSession = getOrBuildItsNatSession();
060:
061: try {
062: request.setCharacterEncoding("UTF-8");
063: // Lo hacemos antes de tocar nada, es fundamental para caracteres no ASCII (ej. acentos),
064: // es el encoding por defecto y además nos viene "encoded" con encodeURIComponent que codifica
065: // como Unicode ej. %C3%A1 es la á, sin "UTF-8" el getParameterOrAttribute devuelve dos caracteres, con "UTF-8" devuelve la á
066: // Tenemos el problema de que no podemos poner otro encoding pues depende del documento,
067: // y el encoding hay que definirlo antes de obtener valores de parámetros
068: } catch (UnsupportedEncodingException ex) {
069: throw new ItsNatException(ex);
070: }
071:
072: }
073:
074: protected abstract ItsNatSessionImpl getOrBuildItsNatSession();
075:
076: public ItsNatSessionImpl getItsNatSessionImpl() {
077: return itsnatSession;
078: }
079:
080: public ItsNatServletImpl getItsNatServletImpl() {
081: return itsNatServlet;
082: }
083:
084: public ItsNatServlet getItsNatServlet() {
085: return itsNatServlet;
086: }
087:
088: public ServletRequest getServletRequest() {
089: return request;
090: }
091:
092: public ItsNatServletResponse getItsNatServletResponse() {
093: return itsNatResponse;
094: }
095:
096: public ItsNatServletResponseImpl getItsNatServletResponseImpl() {
097: return itsNatResponse;
098: }
099:
100: public ItsNatDocumentImpl getItsNatDocumentImpl() {
101: return itsNatDoc;
102: }
103:
104: public ItsNatDocument getItsNatDocument() {
105: return itsNatDoc;
106: }
107:
108: public String getParameterOrAttribute(String name) {
109: String value = request.getParameter(name);
110: if (value == null)
111: value = (String) request.getAttribute(name);
112: return value;
113: }
114:
115: public void setItsNatDocument(ItsNatDocumentImpl itsNatDoc) {
116: this .itsNatDoc = itsNatDoc;
117:
118: itsNatDoc.setCurrentItsNatServletRequest(this );
119: }
120:
121: public void unsetItsNatDocument() {
122: if (itsNatDoc != null) {
123: // Para que el garbage collector pueda liberar el request y el response
124: itsNatDoc.setCurrentItsNatServletRequest(null);
125:
126: this .itsNatDoc = null;
127: }
128: }
129:
130: public ClientDocument getClientDocument() {
131: return clientDoc;
132: }
133:
134: public ClientDocumentImpl getClientDocumentImpl() {
135: return clientDoc;
136: }
137:
138: public void setClientDocument(ClientDocumentImpl docListener) {
139: this .clientDoc = docListener;
140: }
141:
142: public boolean isMSIE() {
143: // No tiene por qué ser público este método
144: return getItsNatSessionImpl().isMSIE();
145: }
146:
147: public ItsNatServletContextImpl getItsNatServletContext() {
148: return getItsNatServletImpl().getItsNatServletConfigImpl()
149: .getItsNatServletContextImpl();
150: }
151:
152: public ItsNatSession getItsNatSession() {
153: return getItsNatSessionImpl();
154: }
155:
156: public void process(ItsNatServletResponseImpl itsNatResponse) {
157: this .itsNatResponse = itsNatResponse;
158:
159: RequestImpl delegRequest;
160:
161: if (isRemoteControl())
162: delegRequest = createRemoteControlRequest();
163: else if (isLoadScript())
164: delegRequest = createLoadScriptRequest(); // Puede ser al cargar una página "normal" o "remote"
165: else if (isNormalRequest())
166: delegRequest = createNormalRequest();
167: else
168: delegRequest = createCustomRequest();
169:
170: delegRequest.process();
171: }
172:
173: public boolean isRemoteControl() {
174: String remoteCtrl = getParameterOrAttribute("itsnat_remctrl");
175: return ((remoteCtrl != null) && remoteCtrl.equals("true"));
176: }
177:
178: public boolean isLoadScript() {
179: String loadScript = getParameterOrAttribute("itsnat_load_script");
180: return ((loadScript != null) && loadScript.equals("true"));
181: }
182:
183: public boolean isNormalRequest() {
184: String docId = getParameterOrAttribute("itsnat_doc_id");
185: if (docId != null)
186: return true;
187:
188: String docName = getParameterOrAttribute("itsnat_doc_name");
189: if (docName != null)
190: return true;
191:
192: return false;
193: }
194:
195: public RequestImpl createNormalRequest() {
196: String docId = getParameterOrAttribute("itsnat_doc_id");
197: if (docId == null) // Carga de la página por vez primera
198: {
199: String docName = getParameterOrAttribute("itsnat_doc_name");
200: // Tenemos la seguridad de que no es nulo, sino no llegaríamos aquí
201:
202: this .itsNatDocReferrer = getItsNatSessionImpl()
203: .popReferrerDocument();
204:
205: return new RequestNormalLoadDocImpl(docName, this );
206: } else {
207: // Evento via AJAX
208: return new RequestNormalEventImpl(docId, this );
209: }
210: }
211:
212: public RequestImpl createRemoteControlRequest() {
213: String observerId = getParameterOrAttribute("itsnat_observer_id");
214: if (observerId == null) // Es una solicitud de control/visor remoto
215: {
216: return new RequestRemoteControlLoadDocImpl(this );
217: } else // Refresco del estado por temporizador via AJAX
218: {
219: return new RequestRemoteControlEventImpl(observerId, this );
220: }
221: }
222:
223: public RequestImpl createLoadScriptRequest() {
224: // Carga del script de iniciación del document (el <script> del final del documento)
225:
226: String docId = getParameterOrAttribute("itsnat_doc_id");
227: if (docId == null)
228: throw new ItsNatException(
229: "Misssing parameter: itsnat_doc_id");
230:
231: return new RequestLoadScriptImpl(docId, this );
232: }
233:
234: public RequestImpl createCustomRequest() {
235: // También tiene derecho al referrer
236: this .itsNatDocReferrer = getItsNatSessionImpl()
237: .popReferrerDocument();
238:
239: return new RequestCustomImpl(this );
240: }
241:
242: public Object getVariable(String varName) {
243: ServletRequest request = getServletRequest();
244: Object value = request.getParameter(varName);
245: if (value != null)
246: return value;
247:
248: value = request.getAttribute(varName);
249: if (value != null)
250: return value;
251:
252: return getItsNatDocumentImpl().getVariable(varName);
253: }
254:
255: public ItsNatVariableResolver createItsNatVariableResolver() {
256: return new ItsNatVariableResolverImpl(null, this , null, null,
257: null);
258: }
259:
260: public ItsNatDocument getItsNatDocumentReferrer() {
261: return itsNatDocReferrer;
262: }
263:
264: public abstract String getServletURLInternal();
265: }
|