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.DocFragmentTemplate;
017: import org.itsnat.core.ItsNat;
018: import org.itsnat.core.event.ItsNatServletRequestListener;
019: import org.itsnat.core.ItsNatServlet;
020: import org.itsnat.core.ItsNatServletConfig;
021: import org.itsnat.core.DocumentTemplate;
022: import org.itsnat.core.event.RemoteControlEventListener;
023: import java.util.Collections;
024: import java.util.HashMap;
025: import java.util.Iterator;
026: import java.util.LinkedList;
027: import java.util.Map;
028: import javax.servlet.Servlet;
029: import org.itsnat.comp.CreateItsNatComponentListener;
030: import org.itsnat.core.ItsNatException;
031: import org.itsnat.core.ItsNatServletContext;
032: import org.itsnat.impl.core.html.HTMLDocFragmentTemplateImpl;
033: import org.itsnat.impl.core.html.HTMLDocumentTemplateImpl;
034: import org.itsnat.impl.core.http.ItsNatImpl;
035: import org.itsnat.impl.core.util.UniqueIdGenerator;
036: import org.itsnat.impl.core.xml.XMLDocFragmentTemplateImpl;
037: import org.itsnat.impl.core.xml.XMLDocumentTemplateImpl;
038:
039: /**
040: *
041: * @author jmarranz
042: */
043: public abstract class ItsNatServletImpl extends ItsNatUserDataImpl
044: implements ItsNatServlet {
045: protected ItsNatImpl parent;
046: protected Servlet servlet;
047: protected UniqueIdGenerator idGenerator = new UniqueIdGenerator();
048: protected Map pages = Collections.synchronizedMap(new HashMap());
049: protected Map fragments = Collections
050: .synchronizedMap(new HashMap());
051: protected LinkedList requestListeners;
052: protected LinkedList remControlListeners;
053: protected LinkedList createCompListeners;
054: protected ItsNatServletConfigImpl servletConfig;
055:
056: /**
057: * Creates a new instance of ItsNatServletImpl
058: */
059: public ItsNatServletImpl(ItsNatImpl parent, Servlet servlet) {
060: super (true);
061:
062: this .parent = parent;
063: this .servlet = servlet;
064:
065: this .servletConfig = createItsNatServletConfig();
066: }
067:
068: public ItsNatServletConfigImpl createItsNatServletConfig() {
069: return new ItsNatServletConfigImpl(servlet.getServletConfig(),
070: this );
071: }
072:
073: public ItsNatServletContext getItsNatServletContext() {
074: return servletConfig.getItsNatServletContext();
075: }
076:
077: public String generateUniqueId() {
078: return idGenerator.generateUniqueId();
079: }
080:
081: public ItsNat getItsNat() {
082: return getItsNatImpl();
083: }
084:
085: public ItsNatImpl getItsNatImpl() {
086: return parent;
087: }
088:
089: public Servlet getServlet() {
090: return servlet;
091: }
092:
093: public ItsNatServletConfig getItsNatServletConfig() {
094: return servletConfig;
095: }
096:
097: public ItsNatServletConfigImpl getItsNatServletConfigImpl() {
098: return servletConfig;
099: }
100:
101: public DocumentTemplate registerDocumentTemplate(String name,
102: String mime, String path) {
103: DocumentTemplateImpl docTemplate = createDocumentTemplate(name,
104: mime, path);
105: pages.put(name, docTemplate);
106: return docTemplate;
107: }
108:
109: public DocumentTemplateImpl createDocumentTemplate(String name,
110: String mime, String path) {
111: if (DocumentTemplateImpl.isHTMLorXHTML(mime))
112: return createHTMLDocumentTemplate(name, mime, path);
113: else
114: return createXMLDocumentTemplate(name, mime, path);
115: }
116:
117: public HTMLDocumentTemplateImpl createHTMLDocumentTemplate(
118: String name, String mime, String path) {
119: return new HTMLDocumentTemplateImpl(name, mime, path, this );
120: }
121:
122: public XMLDocumentTemplateImpl createXMLDocumentTemplate(
123: String name, String mime, String path) {
124: return new XMLDocumentTemplateImpl(name, mime, path, this );
125: }
126:
127: public DocumentTemplate getDocumentTemplate(String name) {
128: return getDocumentTemplateImpl(name);
129: }
130:
131: public DocumentTemplateImpl getDocumentTemplateImpl(String name) {
132: return (DocumentTemplateImpl) pages.get(name);
133: }
134:
135: public DocFragmentTemplate registerDocFragmentTemplate(String name,
136: String mime, String path) {
137: DocFragmentTemplateImpl fragmentDesc = createDocFragmentTemplate(
138: name, mime, path);
139: fragments.put(name, fragmentDesc);
140: return fragmentDesc;
141: }
142:
143: public DocFragmentTemplateImpl createDocFragmentTemplate(
144: String name, String mime, String path) {
145: if (DocFragmentTemplateImpl.isHTMLorXHTML(mime))
146: return createHTMLDocFragmentTemplate(name, mime, path);
147: else
148: return createXMLDocFragmentTemplate(name, mime, path);
149: }
150:
151: public HTMLDocFragmentTemplateImpl createHTMLDocFragmentTemplate(
152: String name, String mime, String path) {
153: return new HTMLDocFragmentTemplateImpl(name, mime, path, this );
154: }
155:
156: public XMLDocFragmentTemplateImpl createXMLDocFragmentTemplate(
157: String name, String mime, String path) {
158: return new XMLDocFragmentTemplateImpl(name, mime, path, this );
159: }
160:
161: public DocFragmentTemplate getDocFragmentTemplate(String name) {
162: return getDocFragmentTemplateImpl(name);
163: }
164:
165: public DocFragmentTemplateImpl getDocFragmentTemplateImpl(
166: String name) {
167: return (DocFragmentTemplateImpl) fragments.get(name);
168: }
169:
170: public void checkIsAlreadyUsed() {
171: // Si no hay fragmentos registrados no puede haber documentos cargados por usuarios
172: if (!fragments.isEmpty())
173: throw new ItsNatException(
174: "Servlet is frozen because some fragment was already registered");
175: }
176:
177: public LinkedList getItsNatServletRequestListenerList() {
178: if (requestListeners == null)
179: this .requestListeners = new LinkedList();
180: return requestListeners;
181: }
182:
183: public Iterator getItsNatServletRequestListenerIterator() {
184: // No sincronizamos porque sólo admitimos sólo lectura
185: if (requestListeners == null)
186: return null;
187: if (requestListeners.isEmpty())
188: return null;
189: return requestListeners.iterator();
190: }
191:
192: public void addItsNatServletRequestListener(
193: ItsNatServletRequestListener listener) {
194: checkIsAlreadyUsed(); // Así evitamos sincronizar la lista pues si es sólo lectura admite múltiples hilos
195:
196: LinkedList requestListeners = getItsNatServletRequestListenerList();
197: requestListeners.add(listener);
198: }
199:
200: public void removeItsNatServletRequestListener(
201: ItsNatServletRequestListener listener) {
202: checkIsAlreadyUsed(); // Así evitamos sincronizar la lista pues si es sólo lectura admite múltiples hilos
203:
204: LinkedList requestListeners = getItsNatServletRequestListenerList();
205: requestListeners.remove(listener);
206: }
207:
208: public LinkedList getRemoteControlEventListenerList() {
209: if (remControlListeners == null)
210: this .remControlListeners = new LinkedList();
211: return remControlListeners;
212: }
213:
214: public Iterator getRemoteControlEventListenerIterator() {
215: // No sincronizamos porque sólo admitimos sólo lectura
216: if (remControlListeners == null)
217: return null;
218: if (remControlListeners.isEmpty())
219: return null;
220: return remControlListeners.iterator();
221: }
222:
223: public void addRemoteControlEventListener(
224: RemoteControlEventListener listener) {
225: checkIsAlreadyUsed(); // Así evitamos sincronizar la lista pues si es sólo lectura admite múltiples hilos
226:
227: LinkedList remControlListeners = getRemoteControlEventListenerList();
228: remControlListeners.add(listener);
229: }
230:
231: public void removeRemoteControlEventListener(
232: RemoteControlEventListener listener) {
233: checkIsAlreadyUsed(); // Así evitamos sincronizar la lista pues si es sólo lectura admite múltiples hilos
234:
235: LinkedList remControlListeners = getRemoteControlEventListenerList();
236: remControlListeners.remove(listener);
237: }
238:
239: public LinkedList getCreateItsNatComponentList() {
240: if (createCompListeners == null)
241: this .createCompListeners = new LinkedList(); // Sólo se crea si se necesita
242: return createCompListeners;
243: }
244:
245: public Iterator getCreateItsNatComponentListenerIterator() {
246: if (createCompListeners == null)
247: return null;
248: if (createCompListeners.isEmpty())
249: return null;
250: return createCompListeners.iterator();
251: }
252:
253: public void addCreateItsNatComponentListener(
254: CreateItsNatComponentListener listener) {
255: checkIsAlreadyUsed(); // Así evitamos sincronizar la lista pues si es sólo lectura admite múltiples hilos
256:
257: LinkedList list = getCreateItsNatComponentList();
258: list.add(listener);
259: }
260:
261: public void removeCreateItsNatComponentListener(
262: CreateItsNatComponentListener listener) {
263: checkIsAlreadyUsed(); // Así evitamos sincronizar la lista pues si es sólo lectura admite múltiples hilos
264:
265: LinkedList list = getCreateItsNatComponentList();
266: list.remove(listener);
267: }
268: }
|