/*
* $Id: SourceDefinitionServiceImpl.java,v 1.3 2006/09/25 08:52:36 acaproni Exp $
*
* $Date: 2006/09/25 08:52:36 $
* $Revision: 1.3 $
* $Author: acaproni $
*
* Copyright CERN, All Rights Reserved.
*/
package cern.laser.business.pojo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.apache.log4j.Logger;
import cern.laser.business.cache.AlarmCache;
import cern.laser.business.dao.AdminUserDAO;
import cern.laser.business.dao.AlarmDAO;
import cern.laser.business.dao.CategoryDAO;
import cern.laser.business.dao.ResponsiblePersonDAO;
import cern.laser.business.dao.SourceDAO;
import cern.laser.business.data.AdminUser;
import cern.laser.business.data.Alarm;
import cern.laser.business.data.AlarmImpl;
import cern.laser.business.data.Category;
import cern.laser.business.data.CategoryImpl;
import cern.laser.business.data.ResponsiblePerson;
import cern.laser.business.data.Source;
import cern.laser.business.definition.LaserDefinitionDuplicationException;
import cern.laser.business.definition.LaserDefinitionException;
import cern.laser.business.definition.LaserDefinitionNotAllowedException;
import cern.laser.business.definition.LaserDefinitionNotFoundException;
import cern.laser.business.definition.LaserDefinitionNotValidException;
import cern.laser.business.definition.data.AlarmDefinition;
import cern.laser.business.definition.data.CategoryDefinition;
import cern.laser.business.definition.data.SourceDefinition;
/**
*
*
* @version $Revision: 1.3 $ $Date: 2006/09/25 08:52:36 $
* @author Katarina Sigerud
*/
public class SourceDefinitionServiceImpl {
private static final Logger LOGGER = Logger.getLogger(SourceDefinitionServiceImpl.class.getName());
private static final String SOURCES_CATEGORY_ROOT_PATH = "CERN.SOURCES";
private static final String SOURCE_CATEGORY_PATH_PREFIX = "CERN.SOURCES.";
private static final AlarmDefinition SOURCE_SURVEILLANCE_ALARM_DEFINITION = new AlarmDefinition("SURVEILLANCE",
"<FAULT MEMBER>", new Integer(1), "SURVEILLANCE", "<IDENTIFIER>", "Not connected", new Integer(1),
"Backup not received", "Contact source responsible person", "Source status not guaranteed", Boolean.FALSE, null,
"LASER", null, null, null, null, null, new Integer(0), null, null);
private AdminUserDAO adminUserDAO;
private AlarmDAO alarmDAO;
private CategoryDAO categoryDAO;
private ResponsiblePersonDAO responsiblePersonDAO;
private SourceDAO sourceDAO;
private AlarmCache alarmCache;
private AlarmDefinitionServiceImpl alarmDefinitionService;
private AdminUserDefinitionServiceImpl adminUserDefinitionService;
//
// -- PUBLIC METHODS ----------------------------------------------
//
public void setAdminUserDAO(AdminUserDAO adminUserDAO) {
this.adminUserDAO = adminUserDAO;
}
public void setResponsiblePersonDAO(ResponsiblePersonDAO responsiblePersonDAO) {
this.responsiblePersonDAO = responsiblePersonDAO;
}
public void setCategoryDAO(CategoryDAO categoryDAO) {
this.categoryDAO = categoryDAO;
}
public void setSourceDAO(SourceDAO sourceDAO) {
this.sourceDAO = sourceDAO;
}
public void setAlarmDAO(AlarmDAO alarmDAO) {
this.alarmDAO = alarmDAO;
}
public void setAlarmCache(AlarmCache alarmCache) {
this.alarmCache = alarmCache;
}
public void setAlarmDefinitionService(AlarmDefinitionServiceImpl alarmDefinitionService) {
this.alarmDefinitionService = alarmDefinitionService;
}
public SourceDefinition getSourceDefinition(String sourceId) throws LaserDefinitionException {
if (sourceId == null) throw new LaserDefinitionNotValidException("source id is null");
Source source = sourceDAO.getSource(sourceId);
if (source == null) { throw new LaserDefinitionNotFoundException("unable to find source " + sourceId); }
return source.getDefinition();
// new SourceDefinition(source.getName(), source.getDescription(), source.getHostName(), source
// .getConnectionTimeout(), source.getResponsiblePerson().getResponsibleId());
}
public Collection getSourceDefinitions(String userId) throws LaserDefinitionException {
LOGGER.info("getting administered sources for user : " + userId);
AdminUser admin_user = adminUserDAO.findAdminUser(userId);
String[] sources = adminUserDAO.getAdministeredSources(userId);
Collection result = new ArrayList(sources.length);
for (int i = 0; i < sources.length; i++) {
result.add(getSourceDefinition(sources[i]));
}
LOGGER.info("found " + result.size() + " administered sources");
return result;
}
public void createSource(String userId, SourceDefinition sourceDefinition) throws LaserDefinitionException {
if (sourceDefinition == null) { throw new LaserDefinitionNotValidException("source is null"); }
Source source = sourceDAO.getSource(sourceDefinition.getSourceId());
if (source != null) {
throw new LaserDefinitionDuplicationException("source "+sourceDefinition.getSourceId()+" already exist");
}
if (sourceDefinition.getResponsiblePersonId() == null) { throw new LaserDefinitionNotValidException(
"responsible id for the source definition is null"); }
ResponsiblePerson responsible = responsiblePersonDAO.getResponsiblePerson(sourceDefinition.getResponsiblePersonId());
if (responsible == null) { throw new LaserDefinitionNotValidException(
"responsible with id "+sourceDefinition.getResponsiblePersonId()+" does not exist"); }
AdminUser admin_user = adminUserDAO.findAdminUser(userId);
AdminUser laser_user = adminUserDAO.findByLaserAdminUser();
LOGGER.info("user " + admin_user.getName() + " creating source : " + sourceDefinition);
// create the source
source = new Source(sourceDefinition, responsible);
CategoryDefinition category_definition = new CategoryDefinition(SOURCE_CATEGORY_PATH_PREFIX
+ sourceDefinition.getName(), "Category for source " + sourceDefinition.getName());
Category parent_category = categoryDAO.findCategoryByPath(category_definition.getParentPath());
Category category = new CategoryImpl(category_definition);
parent_category.addChildCategory(category);
categoryDAO.saveCategory(category);
admin_user.addAdministeredCategory(category);
laser_user.addAdministeredCategory(category);
if (LOGGER.isDebugEnabled())
LOGGER.debug("default category " + category_definition.getPath() + "created for source "
+ sourceDefinition.getName());
source.setSurveillanceAlarmId(alarmDAO.findLaserSurveillanceAlarmId());
sourceDAO.saveSource(source);
// create the source surveillance alarm
AlarmDefinition surveillance_alarm_definition = (AlarmDefinition) SOURCE_SURVEILLANCE_ALARM_DEFINITION.clone();
surveillance_alarm_definition.setFaultMember(sourceDefinition.getName());
surveillance_alarm_definition.setIdentifier(sourceDefinition.getName());
Alarm surveillance_alarm = new AlarmImpl(surveillance_alarm_definition, source, responsible);
Category surveillance_category = categoryDAO.findBySurveillanceCategory();
surveillance_category.addAlarm(surveillance_alarm);
category.addAlarm(surveillance_alarm);
alarmDAO.saveAlarm(surveillance_alarm);
categoryDAO.updateCategory(surveillance_category);
categoryDAO.updateCategory(category);
if (LOGGER.isDebugEnabled()) LOGGER.debug("surveillance alarm created for source " + sourceDefinition.getName());
source.setSurveillanceAlarmId(surveillance_alarm.getAlarmId());
sourceDAO.updateSource(source);
admin_user.addAdministeredSource(source);
laser_user.addAdministeredSource(source);
adminUserDAO.updateAdminUser(admin_user);
adminUserDAO.updateAdminUser(laser_user);
LOGGER.info("source created");
}
public void createSources(String userId, Collection sources) throws LaserDefinitionException {
if ((sources == null) || (sources.size() == 0)) { return; }
LOGGER.info("creating " + sources.size() + " sources");
Iterator iterator = sources.iterator();
while (iterator.hasNext()) {
createSource(userId, (SourceDefinition) iterator.next());
}
LOGGER.info("sources created");
}
public void updateSource(String userId, SourceDefinition sourceDefinition) throws LaserDefinitionException {
if (sourceDefinition == null) { throw new LaserDefinitionNotValidException("source is null"); }
Source source = null;
source = sourceDAO.findSource(sourceDefinition.getSourceId());
if (!sourceDefinition.getName().equals(source.getName())) { throw new LaserDefinitionNotValidException(
"source name cannot be changed"); }
AdminUser admin_user = adminUserDAO.findAdminUser(userId);
if (!admin_user.administersSource(source)) { throw new LaserDefinitionNotAllowedException(
"not an administrator for source : " + sourceDefinition); }
try {
LOGGER.info("user " + admin_user.getName() + " updating source : " + sourceDefinition);
source.setDefinition(sourceDefinition);
sourceDAO.updateSource(source);
String[] alarms = sourceDAO.getAlarms(source.getSourceId());
for (int i = 0; i < alarms.length; i++) {
try {
alarmCache.invalidate(alarms[i]);
} catch (Exception e) {
LOGGER.error("unable to propagate alarm source update", e);
}
}
LOGGER.info("source updated");
} catch (Exception e) {
throw new LaserDefinitionException("unable to update source " + sourceDefinition + " : " + e.getMessage(), e);
}
}
public void updateSources(String userId, Collection sources) throws LaserDefinitionException {
if ((sources == null) || (sources.size() == 0)) { return; }
LOGGER.info("updating " + sources.size() + " sources");
Iterator iterator = sources.iterator();
while (iterator.hasNext()) {
updateSource(userId, (SourceDefinition) iterator.next());
}
LOGGER.info("sources updated");
}
public void removeSource(String userId, SourceDefinition sourceDefinition) throws LaserDefinitionException {
if (sourceDefinition == null) { throw new LaserDefinitionNotValidException("source is null"); }
AdminUser admin_user = adminUserDAO.findAdminUser(userId);
AdminUser laser_user = adminUserDAO.findByLaserAdminUser();
Source source = sourceDAO.findSource(sourceDefinition.getSourceId());
if (!admin_user.administersSource(source)) { throw new LaserDefinitionNotAllowedException(
"not in source administrators"); }
if (sourceDAO.getAlarms(sourceDefinition.getSourceId()).length > 1) { throw new LaserDefinitionNotAllowedException(
"source has attached alarms"); }
try {
LOGGER.info("user " + admin_user.getName() + " removing source : " + sourceDefinition);
alarmDefinitionService.removeAlarm(adminUserDAO.findByLaserAdminUser().getUserId(), alarmDAO.findAlarm(
source.getSurveillanceAlarmId()).getDefinition());
admin_user.removeAdministeredSource(source);
laser_user.removeAdministeredSource(source);
sourceDAO.deleteSource(source);
source = null;
String category_path = new String(SOURCE_CATEGORY_PATH_PREFIX + sourceDefinition.getName());
Category parent_category = categoryDAO.findCategoryByPath(SOURCES_CATEGORY_ROOT_PATH);
Category category = categoryDAO.findCategoryByPath(category_path);
parent_category.removeChildCategory(category);
admin_user.removeAdministeredCategory(category);
laser_user.removeAdministeredCategory(category);
categoryDAO.deleteCategory(category);
if (LOGGER.isDebugEnabled())
LOGGER.debug("removed default category " + category_path + " for source " + sourceDefinition.getName());
adminUserDAO.updateAdminUser(admin_user);
adminUserDAO.updateAdminUser(laser_user);
LOGGER.info("removed source " + sourceDefinition.getName());
} catch (Exception e) {
throw new LaserDefinitionException("unable to remove source " + sourceDefinition + " : " + e.getMessage(), e);
}
}
/*
* (non-Javadoc)
*
* @see cern.laser.business.ejb.DefinitionServiceSessionEJB#removeSources(java.lang.Integer, java.util.Collection)
*/
public void removeSources(String userId, Collection sources) throws LaserDefinitionException {
if ((sources == null) || (sources.size() == 0)) { return; }
LOGGER.info("removing " + sources.size() + " sources");
Iterator iterator = sources.iterator();
while (iterator.hasNext()) {
removeSource(userId, (SourceDefinition) iterator.next());
}
LOGGER.info("sources removed");
}
/*
* (non-Javadoc)
*
* @see cern.laser.business.ejb.DefinitionServiceSessionEJB#uploadSources(java.lang.Integer, java.util.Collection,
* java.util.Collection, java.util.Collection)
*/
public void uploadSources(String userId, Collection toBeCreated, Collection toBeUpdated, Collection toBeRemoved)
throws LaserDefinitionException {
LOGGER.info("uploading source definitions : [userId=" + userId + ", toBeCreated="
+ ((toBeCreated == null) ? 0 : toBeCreated.size()) + ", toBeUpdated="
+ ((toBeUpdated == null) ? 0 : toBeUpdated.size()) + ", toBeRemoved="
+ ((toBeRemoved == null) ? 0 : toBeRemoved.size()) + "]");
createSources(userId, toBeCreated);
updateSources(userId, toBeUpdated);
removeSources(userId, toBeRemoved);
LOGGER.info("source definitions uploaded");
}
//
// -- PRIVATE METHODS ----------------------------------------------
//
}