/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
* Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/
package org.infoglue.calendar.actions;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Category;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.infoglue.calendar.controllers.CategoryController;
import org.infoglue.calendar.controllers.EventController;
import org.infoglue.calendar.controllers.LanguageController;
import org.infoglue.calendar.entities.Event;
import org.infoglue.calendar.entities.EventVersion;
import org.infoglue.calendar.entities.Language;
import org.infoglue.common.util.CacheController;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.ActionContext;
/**
* This is the action that shows the application state and also can be used to set up surveilence.
* The idea is to have one command which allways returns a known resultpage if it's ok. Otherwise it prints
* an error-statement. This action is then called every x minutes by the surveilence and an alarm is raised if something is wrong.
* We also have a command which can list more status about the application.
*
* @author Mattias Bogeblad
*/
public class ViewApplicationStateAction extends CalendarAbstractAction
{
private static Log log = LogFactory.getLog(ViewApplicationStateAction.class);
private List states = new ArrayList();
private boolean databaseConnectionOk = false;
private boolean applicationSettingsOk = false;
private boolean testQueriesOk = false;
private boolean diskPermissionOk = false;
private String cacheName = "";
private String message = "";
private String className = "";
private String logLevel = "";
/**
* The constructor for this action - contains nothing right now.
*/
public ViewApplicationStateAction()
{
}
private Category getDeliverCategory()
{
Enumeration enumeration = Logger.getCurrentCategories();
while(enumeration.hasMoreElements())
{
Category category = (Category)enumeration.nextElement();
if(category.getName().equalsIgnoreCase("org.infoglue.deliver"))
return category;
}
return null;
}
private Category getCastorJDOCategory()
{
Enumeration enumeration = Logger.getCurrentCategories();
while(enumeration.hasMoreElements())
{
Category category = (Category)enumeration.nextElement();
if(category.getName().equalsIgnoreCase("org.exolab.castor.jdo"))
return category;
}
return null;
}
private Category getCategory(String className)
{
Enumeration enumeration = Logger.getCurrentCategories();
while(enumeration.hasMoreElements())
{
Category category = (Category)enumeration.nextElement();
if(category.getName().equalsIgnoreCase(className))
return category;
}
Category category = Category.getInstance(className);
return category;
}
/**
* This action allows clearing of the given cache manually.
*/
public String doClearCache() throws Exception
{
return "cleared";
}
/**
* This action allows clearing of the given cache manually.
*/
public String doClearAllCaches() throws Exception
{
CacheController.clearCaches();
Session session = this.getSession();
session.getSessionFactory().evictQueries();
session.getSessionFactory().evict(org.infoglue.calendar.entities.Calendar.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.Category.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.Event.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.EventType.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.EventTypeCategoryAttribute.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.EventCategory.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.Location.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.Participant.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.Resource.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.Entry.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.Role.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.Group.class);
session.getSessionFactory().evict(org.infoglue.calendar.entities.Subscriber.class);
return "cleared";
}
/**
* This action allows setting of the loglevel on any class.
*/
public String logLevel() throws Exception
{
log.debug("Setting loglevel....");
Level newLevel = Level.ERROR;
if(this.logLevel.equalsIgnoreCase("debug"))
newLevel = Level.DEBUG;
if(this.logLevel.equalsIgnoreCase("info"))
newLevel = Level.INFO;
else if(this.logLevel.equalsIgnoreCase("warn"))
newLevel = Level.WARN;
else if(this.logLevel.equalsIgnoreCase("error"))
newLevel = Level.ERROR;
Category category = getCategory(this.className);
if(category != null)
category.setLevel(newLevel);
log.debug("Setting loglevel end....");
return "cleared";
}
/**
* This action allows clearing of the caches manually.
*/
public String doClearCaches() throws Exception
{
CacheController.clearCache("groupsCache");
CacheController.clearCache("groupsCache");
CacheController.clearCache("principalsCache");
return "cleared";
}
/**
* This action allows clearing of the caches manually.
*/
public String doFixInconsistencies() throws Exception
{
int fixed = CategoryController.getController().clearBrokenCategoryReferences(getSession());
ServletActionContext.getRequest().getSession().setAttribute("message", "Number of fixed inconsistencies: " + fixed);
ActionContext.getContext().getValueStack().getContext().put("message", "Number of fixed inconsistencies: " + fixed);
return "cleared";
}
/**
* This action allows upgrade of model from a versionless situation to a version based event handling.
*/
public String doUpgradeModel() throws Exception
{
/*
Language language = LanguageController.getController().getMasterLanguage(getSession());
List events = EventController.getController().getEventList(getSession());
Iterator eventsIterator = events.iterator();
while(eventsIterator.hasNext())
{
Event event = (Event)eventsIterator.next();
if(event.getVersions().size() == 0)
{
EventVersion eventVersion = new EventVersion();
eventVersion.setLanguage(language);
eventVersion.setEvent(event);
eventVersion.setName(event.getName());
eventVersion.setDescription(event.getDescription());
eventVersion.setOrganizerName(event.getOrganizerName());
eventVersion.setLecturer(event.getLecturer());
eventVersion.setCustomLocation(event.getCustomLocation());
eventVersion.setAlternativeLocation(event.getAlternativeLocation());
eventVersion.setShortDescription(event.getShortDescription());
eventVersion.setLongDescription(event.getLongDescription());
eventVersion.setEventUrl(event.getEventUrl());
//eventVersion.setContactName(event.getContactName());
//eventVersion.setContactEmail(event.getContactEmail());
//eventVersion.setContactPhone(event.getContactPhone());
//eventVersion.setPrice(event.getPrice());
eventVersion.setAttributes(event.getAttributes());
getSession().save(eventVersion);
}
getSession().update(event);
}
*/
return "success";
}
private List getList(String key, String value)
{
List list = new ArrayList();
list.add(key);
list.add(value);
return list;
}
/**
* This method is the application entry-point. The method does a lot of checks to see if infoglue
* is installed correctly and if all resources needed are available.
*/
public String doExecute() throws Exception
{
long start = System.currentTimeMillis();
return "success";
}
public boolean getIsApplicationSettingsOk()
{
return applicationSettingsOk;
}
public boolean getIsDatabaseConnectionOk()
{
return databaseConnectionOk;
}
public boolean getIsDiskPermissionOk()
{
return diskPermissionOk;
}
public boolean getIsTestQueriesOk()
{
return testQueriesOk;
}
public List getStates()
{
return states;
}
public void setCacheName(String cacheName)
{
this.cacheName = cacheName;
}
public String getServerName()
{
String serverName = "Unknown";
try
{
InetAddress localhost = InetAddress.getLocalHost();
serverName = localhost.getHostName();
}
catch(Exception e)
{
}
return serverName;
}
public void setClassName(String className) {
this.className = className;
}
public void setLogLevel(String logLevel) {
this.logLevel = logLevel;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}