KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > infoglue > deliver > applications > actions > ViewApplicationStateAction


1 /* ===============================================================================
2  *
3  * Part of the InfoGlue Content Management Platform (www.infoglue.org)
4  *
5  * ===============================================================================
6  *
7  * Copyright (C)
8  *
9  * This program is free software; you can redistribute it and/or modify it under
10  * the terms of the GNU General Public License version 2, as published by the
11  * Free Software Foundation. See the file LICENSE.html for more information.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
15  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along with
18  * this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
19  * Place, Suite 330 / Boston, MA 02111-1307 / USA.
20  *
21  * ===============================================================================
22  */

23
24 package org.infoglue.deliver.applications.actions;
25
26 import java.net.InetAddress JavaDoc;
27 import java.util.ArrayList JavaDoc;
28 import java.util.Enumeration JavaDoc;
29 import java.util.List JavaDoc;
30 import java.util.Map JavaDoc;
31
32 import javax.servlet.http.HttpServletResponse JavaDoc;
33
34 import org.apache.log4j.Appender;
35 import org.apache.log4j.Category;
36 import org.apache.log4j.Level;
37 import org.apache.log4j.Logger;
38 import org.apache.log4j.RollingFileAppender;
39 import org.apache.pluto.PortletContainerServices;
40 import org.apache.pluto.portalImpl.services.ServiceManager;
41 import org.apache.pluto.portalImpl.services.portletentityregistry.PortletEntityRegistry;
42 import org.infoglue.cms.applications.common.actions.InfoGlueAbstractAction;
43 import org.infoglue.cms.controllers.kernel.impl.simple.CastorDatabaseService;
44 import org.infoglue.cms.controllers.kernel.impl.simple.ServerNodeController;
45 import org.infoglue.cms.util.CmsPropertyHandler;
46 import org.infoglue.cms.util.CmsSessionContextListener;
47 import org.infoglue.deliver.invokers.ComponentBasedHTMLPageInvoker;
48 import org.infoglue.deliver.portal.ServletConfigContainer;
49 import org.infoglue.deliver.portal.services.PortletEntityRegistryServiceDBImpl;
50 import org.infoglue.deliver.util.CacheController;
51 import org.infoglue.deliver.util.RequestAnalyser;
52
53 /**
54  * This is the action that shows the application state and also can be used to set up surveilence.
55  * The idea is to have one command which allways returns a known resultpage if it's ok. Otherwise it prints
56  * an error-statement. This action is then called every x minutes by the surveilence and an alarm is raised if something is wrong.
57  * We also have a command which can list more status about the application.
58  *
59  * @author Mattias Bogeblad
60  */

61
62 public class ViewApplicationStateAction extends InfoGlueAbstractAction
63 {
64     private List JavaDoc states = new ArrayList JavaDoc();
65     
66     private boolean databaseConnectionOk = false;
67     private boolean applicationSettingsOk = false;
68     private boolean testQueriesOk = false;
69     private boolean diskPermissionOk = false;
70     
71     private String JavaDoc cacheName = "";
72
73     private String JavaDoc className = "";
74     private String JavaDoc logLevel = "";
75
76     /**
77      * The constructor for this action - contains nothing right now.
78      */

79     
80     public ViewApplicationStateAction()
81     {
82     
83     }
84     
85     private Category getDeliverCategory()
86     {
87         Enumeration JavaDoc enumeration = Logger.getCurrentCategories();
88         while(enumeration.hasMoreElements())
89         {
90             Category category = (Category)enumeration.nextElement();
91             if(category.getName().equalsIgnoreCase("org.infoglue.deliver"))
92                 return category;
93         }
94         
95         return null;
96     }
97
98     private Category getCastorJDOCategory()
99     {
100         Enumeration JavaDoc enumeration = Logger.getCurrentCategories();
101         while(enumeration.hasMoreElements())
102         {
103             Category category = (Category)enumeration.nextElement();
104             if(category.getName().equalsIgnoreCase("org.exolab.castor.jdo"))
105                 return category;
106         }
107         
108         return null;
109     }
110
111     private Category getCategory(String JavaDoc className)
112     {
113         Enumeration JavaDoc enumeration = Logger.getCurrentCategories();
114         while(enumeration.hasMoreElements())
115         {
116             Category category = (Category)enumeration.nextElement();
117             if(category.getName().equalsIgnoreCase(className))
118                 return category;
119         }
120         
121         Category category = Category.getInstance(className);
122        
123         return category;
124     }
125
126     /**
127      * This action allows clearing of the given cache manually.
128      */

129     public String JavaDoc doClearCache() throws Exception JavaDoc
130     {
131         if(!ServerNodeController.getController().getIsIPAllowed(this.getRequest()))
132         {
133             this.getResponse().setContentType("text/plain");
134             this.getResponse().setStatus(HttpServletResponse.SC_FORBIDDEN);
135             this.getResponse().getWriter().println("You have no access to this view - talk to your administrator if you should.");
136             
137             return NONE;
138         }
139         
140         CacheController.clearCache(cacheName);
141         
142         //this.getHttpSession().invalidate();
143

144         return "cleared";
145     }
146
147     /**
148      * This action allows setting of the loglevel on any class.
149      */

150     public String JavaDoc doSetLogLevel() throws Exception JavaDoc
151     {
152         Level newLevel = Level.ERROR;
153         if(this.logLevel.equalsIgnoreCase("debug"))
154             newLevel = Level.DEBUG;
155         if(this.logLevel.equalsIgnoreCase("info"))
156             newLevel = Level.INFO;
157         else if(this.logLevel.equalsIgnoreCase("warn"))
158             newLevel = Level.WARN;
159         else if(this.logLevel.equalsIgnoreCase("error"))
160             newLevel = Level.ERROR;
161         
162         Category category = getCategory(this.className);
163         if(category != null)
164         {
165             category.setLevel(newLevel);
166             
167             Enumeration JavaDoc enumeration = Logger.getLogger("org.infoglue.console-debug-dummy").getAllAppenders();
168             while(enumeration.hasMoreElements())
169             {
170                 Appender appender = (Appender)enumeration.nextElement();
171                 category.addAppender(appender);
172                 break;
173             }
174
175         }
176         
177         return "cleared";
178     }
179
180     /**
181      * This action allows setting of the loglevel on some basic classes.
182      */

183     public String JavaDoc doSetLogInfo() throws Exception JavaDoc
184     {
185         //ViewPageFilter.logger.setLevel(Level.INFO);
186
//ViewPageAction.logger.setLevel(Level.INFO);
187
//RedirectFilter.logger.setLevel(Level.INFO);
188
CastorDatabaseService.logger.setLevel(Level.INFO);
189         CacheController.logger.setLevel(Level.INFO);
190         getDeliverCategory().setLevel(Level.INFO);
191         getCastorJDOCategory().setLevel(Level.INFO);
192         
193         return "cleared";
194     }
195
196     /**
197      * This action allows setting of the loglevel on some basic classes.
198      */

199     public String JavaDoc doSetLogWarning() throws Exception JavaDoc
200     {
201         //ViewPageFilter.logger.setLevel(Level.WARN);
202
//ViewPageAction.logger.setLevel(Level.WARN);
203
//RedirectFilter.logger.setLevel(Level.WARN);
204
CastorDatabaseService.logger.setLevel(Level.WARN);
205         CacheController.logger.setLevel(Level.WARN);
206         getDeliverCategory().setLevel(Level.WARN);
207         getCastorJDOCategory().setLevel(Level.WARN);
208         
209         return "cleared";
210     }
211
212     /**
213      * This action allows setting of the loglevel on some basic classes.
214      */

215     public String JavaDoc doSetLogError() throws Exception JavaDoc
216     {
217         //ViewPageFilter.logger.setLevel(Level.ERROR);
218
//ViewPageAction.logger.setLevel(Level.ERROR);
219
//RedirectFilter.logger.setLevel(Level.ERROR);
220
CastorDatabaseService.logger.setLevel(Level.ERROR);
221         CacheController.logger.setLevel(Level.ERROR);
222         getDeliverCategory().setLevel(Level.ERROR);
223         getCastorJDOCategory().setLevel(Level.ERROR);
224
225         return "cleared";
226     }
227
228     /**
229      * This action allows clearing of the caches manually.
230      */

231     public String JavaDoc doClearCaches() throws Exception JavaDoc
232     {
233         if(!ServerNodeController.getController().getIsIPAllowed(this.getRequest()))
234         {
235             this.getResponse().setContentType("text/plain");
236             this.getResponse().setStatus(HttpServletResponse.SC_FORBIDDEN);
237             this.getResponse().getWriter().println("You have no access to this view - talk to your administrator if you should.");
238             
239             return NONE;
240         }
241         
242         CacheController.clearCastorCaches();
243         CacheController.clearCaches(null, null, null);
244         
245         return "cleared";
246     }
247
248     /**
249      * This action allows recaching of some parts of the caches manually.
250      */

251     public String JavaDoc doClearPortlets() throws Exception JavaDoc
252     {
253         System.out.println("Updating pluto service manager: infoglueAVote");
254         try
255         {
256             
257             //run registry services to load new portlet info from the registry files
258
String JavaDoc[] svcs = {
259                     "org.apache.pluto.portalImpl.services.portletdefinitionregistry.PortletDefinitionRegistryService",
260                     "org.apache.pluto.portalImpl.services.portletentityregistry.PortletEntityRegistryService"};
261             int len = svcs.length;
262             for (int i = 0; i < len; i++) {
263                 try {
264                     ServiceManager.hotInit(ServletConfigContainer.getContainer().getServletConfig(), svcs[i]);
265                 } catch (Throwable JavaDoc e) {
266                     String JavaDoc svc = svcs[i].substring(svcs[i].lastIndexOf('.') + 1);
267                     String JavaDoc msg = "Initialization of " + svc + " service for hot deployment failed!";
268                     System.out.println(msg);
269                     break;
270                 }
271         
272                 try {
273                     System.out.println("ServletConfigContainer.getContainer().getServletConfig():" + ServletConfigContainer.getContainer().getServletConfig());
274                     System.out.println("ServletConfigContainer.getContainer().getServletConfig().getServletContext():" + ServletConfigContainer.getContainer().getServletConfig().getServletContext());
275                     System.out.println("svcs[i]:" + svcs[i]);
276                     ServiceManager.postHotInit(ServletConfigContainer.getContainer().getServletConfig(), svcs[i]);
277                 } catch (Throwable JavaDoc e) {
278                     String JavaDoc svc = svcs[i].substring(svcs[i].lastIndexOf('.') + 1);
279                     String JavaDoc msg = "Post initialization of " + svc + " service for hot deployment failed!";
280                     System.out.println(msg);
281                     break;
282                 }
283             }
284
285             
286             PortletContainerServices.prepare("infoglueAVote");
287             ServiceManager.init(ServletConfigContainer.getContainer().getServletConfig());
288         
289             PortletEntityRegistry.load();
290
291         } catch (Exception JavaDoc e) {
292             e.printStackTrace();
293         }
294         
295         return "cleared";
296     }
297     
298     /**
299      * This action allows recaching of some parts of the caches manually.
300      */

301     public String JavaDoc doReCache() throws Exception JavaDoc
302     {
303         if(!ServerNodeController.getController().getIsIPAllowed(this.getRequest()))
304         {
305             this.getResponse().setContentType("text/plain");
306             this.getResponse().setStatus(HttpServletResponse.SC_FORBIDDEN);
307             this.getResponse().getWriter().println("You have no access to this view - talk to your administrator if you should.");
308             
309             return NONE;
310         }
311         
312         CacheController.cacheCentralCastorCaches();
313         
314         return "cleared";
315     }
316     
317     private List JavaDoc getList(String JavaDoc key, String JavaDoc value)
318     {
319         List JavaDoc list = new ArrayList JavaDoc();
320         list.add(key);
321         list.add(value);
322
323         return list;
324     }
325     
326     public String JavaDoc doGC() throws Exception JavaDoc
327     {
328         if(!ServerNodeController.getController().getIsIPAllowed(this.getRequest()))
329         {
330             this.getResponse().setContentType("text/plain");
331             this.getResponse().setStatus(HttpServletResponse.SC_FORBIDDEN);
332             this.getResponse().getWriter().println("You have no access to this view - talk to your administrator if you should.");
333             
334             return NONE;
335         }
336         
337         Runtime.getRuntime().gc();
338         
339         return doExecute();
340     }
341     
342     /**
343      * This method is the application entry-point. The method does a lot of checks to see if infoglue
344      * is installed correctly and if all resources needed are available.
345      */

346          
347     public String JavaDoc doExecute() throws Exception JavaDoc
348     {
349         long start = System.currentTimeMillis();
350         if(!ServerNodeController.getController().getIsIPAllowed(this.getRequest()))
351         {
352             this.getResponse().setContentType("text/plain");
353             this.getResponse().setStatus(HttpServletResponse.SC_FORBIDDEN);
354             this.getResponse().getWriter().println("You have no access to this view - talk to your administrator if you should.");
355             
356             return NONE;
357         }
358         
359         String JavaDoc sessionTimeout = CmsPropertyHandler.getSessionTimeout();
360         if(sessionTimeout == null)
361             sessionTimeout = "1800";
362         
363         states.add(getList("Maximum memory", "" + Runtime.getRuntime().maxMemory() / 1024 / 1024 + " MB"));
364         states.add(getList("Used memory", "" + ((Runtime.getRuntime().totalMemory()- Runtime.getRuntime().freeMemory()) / 1024 / 1024) + " MB"));
365         states.add(getList("Free memory", "" + Runtime.getRuntime().freeMemory() / 1024 / 1024 + " MB"));
366         states.add(getList("Total memory", "" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + " MB"));
367         states.add(getList("Number of sessions", "" + CmsSessionContextListener.getActiveSessions() + "(remains for " + (Integer.parseInt(sessionTimeout) / 60) + " minutes after last request)"));
368         states.add(getList("Number of request being handled now", "" + RequestAnalyser.getRequestAnalyser().getNumberOfCurrentRequests()));
369         //states.add(getList("Number of request being handled now", "" + RequestAnalyser.getNumberOfCurrentRequests() + "(average request take " + (RequestAnalyser.getAverageTimeSpentOnOngoingRequests()) + " ms, max now is " + RequestAnalyser.getMaxTimeSpentOnOngoingRequests() + ")"));
370
//states.add(getList("The slowest request handled now is", "" + ((RequestAnalyser.getLongestRequests() != null) ? RequestAnalyser.getLongestRequests().getAttribute("progress") : "")));
371

372         /*
373         Database db = CastorDatabaseService.getDatabase();
374         
375         beginTransaction(db);
376
377         try
378         {
379             List repositoryVOList = RepositoryDeliveryController.getRepositoryDeliveryController().getRepositoryVOList(db);
380             getLogger().info("Number of repositories:" + repositoryVOList.size());
381             this.databaseConnectionOk = true;
382
383             closeTransaction(db);
384         }
385         catch(Exception e)
386         {
387             getLogger().error("An error occurred so we should not complete the transaction:" + e, e);
388             rollbackTransaction(db);
389             throw new SystemException(e.getMessage());
390         }
391         
392         this.applicationSettingsOk = true;
393         this.testQueriesOk = true;
394         
395         try
396         {
397             File testAsset = new File(CmsPropertyHandler.getDigitalAssetPath() + File.separator + "test.txt");
398             FileHelper.writeToFile(testAsset, "ViewApplicationState checking file permissions in asset directory", false);
399             testAsset.delete();
400             
401             File testLog = new File(new File(CmsPropertyHandler.getLogPath()).getParent() + File.separator + "test.txt");
402             FileHelper.writeToFile(testLog, "ViewApplicationState checking file permissions in logs directory", false);
403             testLog.delete();
404
405             this.diskPermissionOk = true;
406         }
407         catch(Exception e)
408         {
409             getLogger().error(e.getMessage(), e);
410         }
411         */

412                 
413         //this.getHttpSession().invalidate();
414

415         return "success";
416     }
417         
418     public boolean getIsApplicationSettingsOk()
419     {
420         return applicationSettingsOk;
421     }
422
423     public boolean getIsDatabaseConnectionOk()
424     {
425         return databaseConnectionOk;
426     }
427
428     public boolean getIsDiskPermissionOk()
429     {
430         return diskPermissionOk;
431     }
432
433     public boolean getIsTestQueriesOk()
434     {
435         return testQueriesOk;
436     }
437
438     public Map JavaDoc getCaches()
439     {
440         return CacheController.getCaches();
441     }
442
443     public Map JavaDoc getEventListeners()
444     {
445         return CacheController.getEventListeners();
446     }
447
448     public List JavaDoc getStates()
449     {
450         return states;
451     }
452     
453     public void setCacheName(String JavaDoc cacheName)
454     {
455         this.cacheName = cacheName;
456     }
457
458     public List JavaDoc getSessionInfoBeanList()
459     {
460         return CmsSessionContextListener.getSessionInfoBeanList();
461     }
462     
463     public String JavaDoc getServerName()
464     {
465         String JavaDoc serverName = "Unknown";
466
467         try
468         {
469             InetAddress JavaDoc localhost = InetAddress.getLocalHost();
470             serverName = localhost.getHostName();
471         }
472         catch(Exception JavaDoc e)
473         {
474             
475         }
476         
477         return serverName;
478     }
479
480     public void setClassName(String JavaDoc className) {
481         this.className = className;
482     }
483
484     public void setLogLevel(String JavaDoc logLevel) {
485         this.logLevel = logLevel;
486     }
487 }
488
Popular Tags