KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > info > magnolia > cms > exchange > simple > SimpleExchangeServlet


1 /**
2  *
3  * Magnolia and its source-code is licensed under the LGPL.
4  * You may copy, adapt, and redistribute this file for commercial or non-commercial use.
5  * When copying, adapting, or redistributing this document in keeping with the guidelines above,
6  * you are required to provide proper attribution to obinary.
7  * If you reproduce or distribute the document without making any substantive modifications to its content,
8  * please use the following attribution line:
9  *
10  * Copyright 1993-2005 obinary Ltd. (http://www.obinary.com) All rights reserved.
11  *
12  */

13 package info.magnolia.cms.exchange.simple;
14
15 import info.magnolia.cms.beans.config.ConfigLoader;
16 import info.magnolia.cms.beans.config.ContentRepository;
17 import info.magnolia.cms.core.CacheHandler;
18 import info.magnolia.cms.core.HierarchyManager;
19 import info.magnolia.cms.security.Authenticator;
20 import info.magnolia.cms.security.Listener;
21 import info.magnolia.cms.security.Lock;
22 import info.magnolia.cms.security.SecureURI;
23 import info.magnolia.cms.security.SessionAccessControl;
24 import info.magnolia.exchange.ExchangeException;
25 import info.magnolia.exchange.Packet;
26
27 import java.io.IOException JavaDoc;
28 import java.io.InputStream JavaDoc;
29 import java.io.ObjectInputStream JavaDoc;
30 import java.io.ObjectOutputStream JavaDoc;
31 import java.net.URL JavaDoc;
32 import java.net.URLConnection JavaDoc;
33
34 import javax.jcr.PathNotFoundException;
35 import javax.servlet.ServletException JavaDoc;
36 import javax.servlet.ServletOutputStream JavaDoc;
37 import javax.servlet.SingleThreadModel JavaDoc;
38 import javax.servlet.http.HttpServlet JavaDoc;
39 import javax.servlet.http.HttpServletRequest JavaDoc;
40 import javax.servlet.http.HttpServletResponse JavaDoc;
41
42 import org.apache.commons.lang.BooleanUtils;
43 import org.apache.commons.lang.StringUtils;
44 import org.apache.log4j.Logger;
45
46
47 /**
48  * <p>
49  * Version .01 implementation Simple implementation of Exchange interface using serialized objects and binary GET
50  * </p>
51  *
52  * <pre>
53  * todo -
54  * 1. implement incremental delivery
55  * 2. concurrent activation
56  * 3. context locking
57  * </pre>
58  *
59  * @author Sameer Charles
60  * @version 2.0
61  */

62 public class SimpleExchangeServlet extends HttpServlet JavaDoc implements SingleThreadModel JavaDoc {
63
64     /**
65      * Stable serialVersionUID.
66      */

67     private static final long serialVersionUID = 222L;
68
69     private static final String JavaDoc DEFAULT_ENCODING = "UTF-8"; //$NON-NLS-1$
70

71     /**
72      * Logger.
73      */

74     private static Logger log = Logger.getLogger(SimpleExchangeServlet.class);
75
76     private transient HierarchyManager hierarchyManager;
77
78     /**
79      * @param request
80      * @param response
81      * @throws ServletException
82      * @throws IOException
83      */

84     public void doGet(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws ServletException JavaDoc, IOException JavaDoc {
85         String JavaDoc context = request.getHeader(Syndicator.WORKING_CONTEXT);
86
87         log.debug("SimpleExchange.doGet()"); //$NON-NLS-1$
88

89         try {
90             response.setContentType("text/plain"); //$NON-NLS-1$
91
response.setCharacterEncoding(DEFAULT_ENCODING);
92             // this.handleActivationRequest();
93

94             String JavaDoc action = request.getHeader(Syndicator.ACTION);
95             String JavaDoc page = request.getHeader(Syndicator.PAGE);
96             String JavaDoc recursive = request.getHeader(Syndicator.RECURSIVE);
97             boolean recurse = BooleanUtils.toBoolean(recursive);
98
99             if (ConfigLoader.isConfigured() && (!Listener.isAllowed(request) || !Authenticator.authenticate(request))) {
100                 // ignore security is server is not configured
101
return;
102             }
103
104             if (ConfigLoader.isConfigured()) {
105                 this.hierarchyManager = SessionAccessControl.getHierarchyManager(request, context);
106             }
107             else {
108                 this.hierarchyManager = ContentRepository.getHierarchyManager(context);
109             }
110
111             // @todo getHierarchyManager() should not return null without throwing an exception
112
if (this.hierarchyManager == null) {
113                 throw new ExchangeException("HierarchyManager is not configured for " + context); //$NON-NLS-1$
114
}
115
116             if (action.equals(Syndicator.ACTIVATE)) {
117                 activate(request);
118             }
119             else if (action.equals(Syndicator.DE_ACTIVATE)) {
120                 deactivate(request);
121             }
122             else if (action.equals(Syndicator.GET)) {
123                 String JavaDoc type = request.getHeader(Syndicator.GET_TYPE);
124                 get(page, type, recurse, response);
125             }
126             else {
127                 throw new UnsupportedOperationException JavaDoc("Method not supported by Exchange protocol - Simple (.01)"); //$NON-NLS-1$
128
}
129         }
130         catch (OutOfMemoryError JavaDoc e) {
131             Runtime JavaDoc rt = Runtime.getRuntime();
132             log.error("---------\nOutOfMemoryError caught during activation. Total memory = " //$NON-NLS-1$
133
+ rt.totalMemory() + ", free memory = " //$NON-NLS-1$
134
+ rt.freeMemory() + "\n---------"); //$NON-NLS-1$
135

136         }
137         catch (Throwable JavaDoc e) {
138             log.error(e.getMessage(), e);
139         }
140     }
141
142     /**
143      * @param request
144      * @param response
145      * @throws ServletException
146      * @throws IOException
147      */

148     public void doPost(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws ServletException JavaDoc, IOException JavaDoc {
149         doGet(request, response);
150     }
151
152     /**
153      * @throws Exception
154      */

155     public void activate(HttpServletRequest JavaDoc request) throws Exception JavaDoc {
156
157         String JavaDoc page = request.getHeader(Syndicator.PAGE);
158
159         if (log.isDebugEnabled()) {
160             log.debug("Exchange : update request received for " + page); //$NON-NLS-1$
161
}
162
163         String JavaDoc parent = request.getHeader(Syndicator.PARENT);
164         String JavaDoc objectType = request.getHeader(Syndicator.OBJECT_TYPE);
165         String JavaDoc recursive = request.getHeader(Syndicator.RECURSIVE);
166         String JavaDoc senderContext = request.getHeader(Syndicator.SENDER_CONTEXT);
167         String JavaDoc context = request.getHeader(Syndicator.WORKING_CONTEXT);
168
169         String JavaDoc protocol = getProtocolName(request);
170         String JavaDoc host = request.getRemoteHost();
171         String JavaDoc remotePort = request.getHeader(Syndicator.REMOTE_PORT);
172         String JavaDoc senderURL = request.getHeader(Syndicator.SENDER_URL);
173
174         if (StringUtils.isEmpty(senderURL)) {
175             senderURL = protocol + "://" + host + ":" + remotePort; //$NON-NLS-1$ //$NON-NLS-2$
176
}
177
178         String JavaDoc handle = StringUtils.defaultString(senderContext) + "/" + Syndicator.DEFAULT_HANDLER; //$NON-NLS-1$
179

180         URL JavaDoc url = new URL JavaDoc(senderURL + handle);
181         String JavaDoc credentials = request.getHeader("Authorization"); //$NON-NLS-1$
182
URLConnection JavaDoc urlConnection = url.openConnection();
183         urlConnection.setRequestProperty("Authorization", credentials); //$NON-NLS-1$
184
urlConnection.addRequestProperty(Syndicator.ACTION, Syndicator.GET);
185         urlConnection.addRequestProperty(Syndicator.WORKING_CONTEXT, context);
186         urlConnection.addRequestProperty(Syndicator.PAGE, page);
187         urlConnection.addRequestProperty(Syndicator.PARENT, parent);
188         urlConnection.addRequestProperty(Syndicator.GET_TYPE, Syndicator.GET_TYPE_SERIALIZED_OBJECT);
189         urlConnection.addRequestProperty(Syndicator.RECURSIVE, recursive);
190         urlConnection.addRequestProperty(Syndicator.OBJECT_TYPE, objectType);
191         // Import activated page
192
InputStream JavaDoc in = urlConnection.getInputStream();
193         try {
194             ObjectInputStream JavaDoc objectInputStream = new ObjectInputStream JavaDoc(in);
195             Object JavaDoc sc = objectInputStream.readObject();
196             // deserialize received object
197
ContentWriter contentWriter = new ContentWriter(this.getHierarchyManager(), context, senderURL
198                 + StringUtils.defaultString(senderContext)
199                 + "/" //$NON-NLS-1$
200
+ Syndicator.DEFAULT_HANDLER, request);
201             contentWriter.writeObject(parent, sc);
202         }
203         catch (Exception JavaDoc e) {
204             log.error("Failed to de-serialize - " + page); //$NON-NLS-1$
205
log.error(e.getMessage(), e);
206         }
207         Lock.setSystemLock();
208         CacheHandler.flushCache();
209         Lock.resetSystemLock();
210     }
211
212     /**
213      * @throws Exception
214      */

215     public void deactivate(HttpServletRequest JavaDoc request) throws Exception JavaDoc {
216
217         String JavaDoc page = request.getHeader(Syndicator.PAGE);
218         if (log.isDebugEnabled()) {
219             log.debug("Exchange : remove request received for " + page); //$NON-NLS-1$
220
}
221         HierarchyManager hm = this.getHierarchyManager();
222
223         try {
224             hm.delete(page);
225             hm.save();
226             CacheHandler.flushCache();
227             SecureURI.delete(page);
228             SecureURI.delete(page + "/*"); //$NON-NLS-1$
229
}
230         catch (PathNotFoundException e) {
231             // ok, the node simply doesn't exist on the public instance, maybe it has never been activated
232
// don't log any error
233
if (log.isDebugEnabled()) {
234                 log.debug("Unable to deactivate node " + page + ": " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
235
}
236         }
237     }
238
239     /**
240      * @throws Exception
241      */

242     private void get(String JavaDoc page, String JavaDoc type, boolean recurse, HttpServletResponse JavaDoc response) throws Exception JavaDoc {
243         if (type.equalsIgnoreCase(Syndicator.GET_TYPE_BINARY)) {
244             // this.getBinary();
245
if (log.isDebugEnabled()) {
246                 log.debug("Binary request for " + page); //$NON-NLS-1$
247
}
248             HierarchyManager hm = this.getHierarchyManager();
249             try {
250                 InputStream JavaDoc is = hm.getNodeData(page).getValue().getStream();
251                 ServletOutputStream JavaDoc os = response.getOutputStream();
252                 byte[] buffer = new byte[8192];
253                 int read = 0;
254                 while ((read = is.read(buffer)) > 0) {
255                     os.write(buffer, 0, read);
256                 }
257                 os.flush();
258                 os.close();
259             }
260             catch (PathNotFoundException e) {
261                 log.error("Unable to spool " + page); //$NON-NLS-1$
262
throw new PathNotFoundException(e.getMessage());
263             }
264         }
265         else {
266             // this.getSerializedObject(); // default type, supporting magnolia 1.1
267
if (log.isDebugEnabled()) {
268                 log.debug("Serialized object request for " + page); //$NON-NLS-1$
269
}
270
271             Packet packet = PacketCollector.getPacket(this.getHierarchyManager(), page, recurse);
272             ObjectOutputStream JavaDoc os = new ObjectOutputStream JavaDoc(response.getOutputStream());
273             os.writeObject(packet.getBody().getObject());
274             os.flush();
275         }
276     }
277
278     private HierarchyManager getHierarchyManager() throws Exception JavaDoc {
279         return this.hierarchyManager;
280     }
281
282     protected String JavaDoc getOperatedHandle(HttpServletRequest JavaDoc request) {
283         return request.getHeader(Syndicator.PAGE);
284     }
285
286     /**
287      * Exclude version number.
288      */

289     private String JavaDoc getProtocolName(HttpServletRequest JavaDoc request) {
290         String JavaDoc protocol = request.getProtocol();
291         return StringUtils.substringBeforeLast(protocol, "/"); //$NON-NLS-1$
292
}
293 }
294
Popular Tags