/*******************************************************************************
* ALMA - Atacama Large Millimeter Array
* Copyright (c) COSYLAB - Control System Laboratory, 2011
* (in the framework of the ALMA collaboration).
* All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*******************************************************************************/
/**
*
*/
package com.cosylab.cdb.jdal.hibernate.plugin;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import alma.TMCDB.alarm.AlarmDefinition;
import alma.TMCDB.alarm.AlarmSystemConfiguration;
import alma.TMCDB.alarm.Categories;
import alma.TMCDB.alarm.DOMConfigurationAccessor;
import alma.TMCDB.alarm.FaultFamiliesMap;
import alma.TMCDB.alarm.FaultMemberDefault;
import alma.TMCDB.alarm.ReductionDefinitions;
import alma.TMCDB.alarm.ReductionLink;
import alma.TMCDB.alarm.ReductionLinks;
import alma.acs.tmcdb.AlarmCategory;
import alma.acs.tmcdb.Component;
import alma.acs.tmcdb.Configuration;
import alma.acs.tmcdb.Contact;
import alma.acs.tmcdb.DefaultMember;
import alma.acs.tmcdb.FaultCode;
import alma.acs.tmcdb.FaultFamily;
import alma.acs.tmcdb.FaultMember;
import alma.acs.tmcdb.Location;
import alma.acs.tmcdb.ReductionLinkAction;
import alma.acs.tmcdb.ReductionLinkType;
import alma.acs.tmcdb.ReductionThreshold;
import com.cosylab.acs.laser.dao.ACSAlarmDAOImpl;
import com.cosylab.acs.laser.dao.ACSCategoryDAOImpl;
import com.cosylab.acs.laser.dao.ACSResponsiblePersonDAOImpl;
import com.cosylab.acs.laser.dao.ConfigurationAccessor;
import com.cosylab.cdb.client.CDBAccess;
import com.cosylab.cdb.jdal.hibernate.RootMap;
/**
* @author msekoranja
*
*/
public class HibernateWDALAlarmPluginImpl implements HibernateWDALPlugin {
private Logger m_logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#getName()
*/
public String getName() {
return "Alarm System plugin";
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#initialize(java.util.logging.Logger)
*/
public void initialize(Logger logger) {
this.m_logger = logger;
}
private static final String nonEmptyString(final String value, final String defaultValue)
{
if (value == null)
return null;
if (value.length() == 0)
return defaultValue;
else
return value;
}
private static final Location getLocation(Session session, alma.acs.alarmsystem.generated.Location daoLocation)
{
if (daoLocation == null)
return null;
Location location = (Location)session.createCriteria(Location.class)
.add(Restrictions.eq("building", daoLocation.getBuilding()))
.add(Restrictions.eq("floor", daoLocation.getFloor()))
.add(Restrictions.eq("room", daoLocation.getRoom()))
.add(Restrictions.eq("mnemonic", daoLocation.getMnemonic()))
.add(Restrictions.eq("locationPosition", daoLocation.getPosition()))
.uniqueResult();
if (location == null)
{
location = new Location();
location.setBuilding(daoLocation.getBuilding());
location.setFloor(daoLocation.getFloor());
location.setRoom(daoLocation.getRoom());
location.setMnemonic(daoLocation.getMnemonic());
location.setLocationPosition(daoLocation.getPosition());
session.persist(location);
}
return location;
}
public static void importAlarms(Session session, Configuration config, ConfigurationAccessor conf, Logger m_logger)
throws Exception
{
// clean up whatever is in the session
session.getTransaction().commit();
session.clear();
session.beginTransaction();
// create DAOs
ACSAlarmDAOImpl alarmDAO = new ACSAlarmDAOImpl(m_logger);
ACSCategoryDAOImpl categoryDAO = new ACSCategoryDAOImpl(m_logger, alarmDAO);
ACSResponsiblePersonDAOImpl responsiblePersonDAO = new ACSResponsiblePersonDAOImpl();
// configure
alarmDAO.setConfAccessor(conf);
alarmDAO.setSurveillanceAlarmId("SURVEILLANCE:SOURCE:1");
alarmDAO.setResponsiblePersonDAO(responsiblePersonDAO);
categoryDAO.setConfAccessor(conf);
//categoryDAO.setCategoryTreeRoot("ACS");
categoryDAO.setCategoryTreeRoot("ROOT");
categoryDAO.setSurveillanceCategoryPath("ACS.SURVEILLANCE");
responsiblePersonDAO.setAlarmDAO(alarmDAO);
// load
final List<alma.acs.alarmsystem.generated.FaultFamily> families = alarmDAO.loadAlarms();
final alma.acs.alarmsystem.generated.Category[] categories = categoryDAO.loadCategories();
Map<String, ArrayList<AlarmCategory>> categoryFaultFamilyLinks = new HashMap<String, ArrayList<AlarmCategory>>();
// store categories
if (categories != null)
for (alma.acs.alarmsystem.generated.Category daoCategory : categories)
{
AlarmCategory category = (AlarmCategory)session.createCriteria(AlarmCategory.class).
add(Restrictions.eq("configuration", config)).
add(Restrictions.eq("alarmCategoryName", daoCategory.getPath())).uniqueResult();
if (category == null)
{
category = new AlarmCategory();
category.setAlarmCategoryName(daoCategory.getPath());
category.setConfiguration(config);
}
category.setDescription(nonEmptyString(daoCategory.getDescription(), "(description)"));
category.setPath(daoCategory.getPath());
category.setIsDefault(daoCategory.getIsDefault());
session.saveOrUpdate(category);
// clear first (in case of update)
category.getFaultFamilies().clear();
// cache mappings
String[] faultFamilies = daoCategory.getAlarms().getFaultFamily();
for (String faultFamily : faultFamilies)
{
ArrayList<AlarmCategory> list = categoryFaultFamilyLinks.get(faultFamily);
if (list == null)
{
list = new ArrayList<AlarmCategory>();
categoryFaultFamilyLinks.put(faultFamily,list);
}
list.add(category);
}
}
// store fault families and contacts, etc.
if (families != null)
for (alma.acs.alarmsystem.generated.FaultFamily family : families)
{
final alma.acs.alarmsystem.generated.Contact daoContact = family.getContact();
Contact contact = (Contact)session.createCriteria(Contact.class).
add(Restrictions.eq("contactName", daoContact.getName())).uniqueResult();
if (contact == null)
{
contact = new Contact();
contact.setContactName(nonEmptyString(daoContact.getName(), "(empty)"));
contact.setEmail(daoContact.getEmail());
contact.setGsm(daoContact.getGsm());
session.persist(contact);
}
// If contact exist, let's check if this contact contains different information. If so,
// issue an error
else {
if( !trimAndNullToEmpty(contact.getEmail()).equals(trimAndNullToEmpty(daoContact.getEmail())) ||
!trimAndNullToEmpty(contact.getGsm()).equals(trimAndNullToEmpty(daoContact.getGsm())) ) {
throw new RuntimeException("Data stored for contact '" + contact.getContactName() + "' in TMCDB " +
"does not match that comming from the 'contact' node of fault family '" + family.getName() +"'. " +
"TMCDB: <" + contact.getEmail() + ", " + contact.getGsm() +">, " +
"CDB: <" + daoContact.getEmail() + ", " + daoContact.getGsm() +">");
}
}
FaultFamily faultFamily = (FaultFamily)session.createCriteria(FaultFamily.class).
add(Restrictions.eq("configuration", config)).
add(Restrictions.eq("familyName", family.getName())).uniqueResult();
if (faultFamily == null)
{
faultFamily = new FaultFamily();
faultFamily.setFamilyName(family.getName());
faultFamily.setConfiguration(config);
}
faultFamily.setAlarmSource(family.getAlarmSource());
faultFamily.setHelpURL(family.getHelpUrl());
faultFamily.setContact(contact);
session.saveOrUpdate(faultFamily);
// clear first (in case of update)
faultFamily.getAlarmCategories().clear();
ArrayList<AlarmCategory> list = categoryFaultFamilyLinks.get(family.getName());
if (list != null)
for (AlarmCategory category : list)
{
category.getFaultFamilies().add(faultFamily);
faultFamily.getAlarmCategories().add(category);
session.update(category);
session.update(faultFamily);
}
// default fault member
if (family.getFaultMemberDefault() != null)
{
DefaultMember defaultMember = null;
// there can be only one
if (faultFamily.getDefaultMembers().size() != 0)
defaultMember = faultFamily.getDefaultMembers().iterator().next();
if (defaultMember == null)
{
defaultMember = new DefaultMember();
defaultMember.setFaultFamily(faultFamily);
}
defaultMember.setLocation(getLocation(session, family.getFaultMemberDefault().getLocation()));
session.saveOrUpdate(defaultMember);
}
else
{
for (DefaultMember memberToRemove : faultFamily.getDefaultMembers())
{
faultFamily.getDefaultMembers().remove(memberToRemove);
session.delete(memberToRemove);
}
session.update(faultFamily);
}
// copy all
Set<FaultMember> faultMembersToRemove = new HashSet<FaultMember>(faultFamily.getFaultMembers());
// add fault members
for (alma.acs.alarmsystem.generated.FaultMember daoFaultMember : family.getFaultMember())
{
FaultMember faultMember = (FaultMember)session.createCriteria(FaultMember.class).
add(Restrictions.eq("memberName", daoFaultMember.getName())).
add(Restrictions.eq("faultFamily", faultFamily)).uniqueResult();
faultMembersToRemove.remove(faultMember);
if (faultMember == null)
{
faultMember = new FaultMember();
faultMember.setMemberName(daoFaultMember.getName());
faultMember.setFaultFamily(faultFamily);
}
faultMember.setLocation(getLocation(session, daoFaultMember.getLocation()));
session.saveOrUpdate(faultMember);
}
if (faultMembersToRemove.size() > 0)
{
for (FaultMember faultMemberToRemove : faultMembersToRemove)
{
faultFamily.getFaultMembers().remove(faultMemberToRemove);
session.delete(faultMemberToRemove);
}
session.update(faultFamily);
}
// copy all
Set<FaultCode> faultCodesToRemove = new HashSet<FaultCode>(faultFamily.getFaultCodes());
// add fault codes
for (alma.acs.alarmsystem.generated.FaultCode daoFaultCode : family.getFaultCode())
{
FaultCode faultCode = (FaultCode)session.createCriteria(FaultCode.class).
add(Restrictions.eq("faultFamily", faultFamily)).
add(Restrictions.eq("codeValue", daoFaultCode.getValue())).uniqueResult();
faultCodesToRemove.remove(faultCode);
if (faultCode == null)
{
faultCode = new FaultCode();
faultCode.setFaultFamily(faultFamily);
faultCode.setCodeValue(daoFaultCode.getValue());
}
faultCode.setPriority(daoFaultCode.getPriority());
faultCode.setCause(daoFaultCode.getCause());
faultCode.setAction(daoFaultCode.getAction());
faultCode.setConsequence(daoFaultCode.getConsequence());
faultCode.setProblemDescription(nonEmptyString(daoFaultCode.getProblemDescription(), "(description)"));
faultCode.setIsInstant(daoFaultCode.getInstant());
session.saveOrUpdate(faultCode);
}
if (faultCodesToRemove.size() > 0)
{
for (FaultCode faultCodeToRemove : faultCodesToRemove)
{
faultFamily.getFaultCodes().remove(faultCodeToRemove);
session.delete(faultCodeToRemove);
}
session.update(faultFamily);
}
}
try
{
alma.alarmsystem.alarmmessage.generated.ReductionDefinitions redDefs = alarmDAO.getReductionDefinitions();
if (redDefs != null)
{
if (redDefs.getLinksToCreate() != null)
saveReductionLinks(session, config, redDefs.getLinksToCreate().getReductionLink(), ReductionLinkAction.CREATE);
if (redDefs.getLinksToRemove() != null)
saveReductionLinks(session, config, redDefs.getLinksToRemove().getReductionLink(), ReductionLinkAction.REMOVE);
int count = 0;
if (redDefs.getThresholds() != null)
{
alma.alarmsystem.alarmmessage.generated.Threshold[] thresholds = redDefs.getThresholds().getThreshold();
for ( alma.alarmsystem.alarmmessage.generated.Threshold threshold : thresholds)
{
// also commit first
if (count % 100 == 0)
{
session.getTransaction().commit();
session.clear(); // cleanup first level cache
session.beginTransaction();
config = (Configuration)session.get(Configuration.class, config.getConfigurationId());
}
count++;
alma.acs.tmcdb.AlarmDefinition alarm = getAlarmDefinition(session, config, threshold.getAlarmDefinition(), false);
alma.acs.tmcdb.ReductionThreshold t = (alma.acs.tmcdb.ReductionThreshold)session.createQuery("from ReductionThreshold " +
"where AlarmDefinitionId = " + alarm.getAlarmDefinitionId()).uniqueResult();
if (t == null)
{
t = new ReductionThreshold();
t.setAlarmDefinition(alarm);
t.setConfiguration(config);
}
t.setValue(threshold.getValue());
session.saveOrUpdate(t);
}
}
}
}
finally
{
// clear cache (to free memory)
adCache.clear();
}
}
private static String trimAndNullToEmpty(String s) {
if( s == null )
return "";
return s.trim();
}
private static void saveReductionLinks(Session session, Configuration config, alma.alarmsystem.alarmmessage.generated.ReductionLinkType[] links, ReductionLinkAction action)
{
int count = 0;
for (alma.alarmsystem.alarmmessage.generated.ReductionLinkType link : links)
{
// also commit first
if (count % 100 == 0)
{
session.getTransaction().commit();
session.clear(); // cleanup first level cache
adCache.clear();
session.beginTransaction();
// refresh
config = (Configuration)session.get(Configuration.class, config.getConfigurationId());
}
count++;
alma.acs.tmcdb.AlarmDefinition parent = getAlarmDefinition(session, config, link.getParent().getAlarmDefinition(), true);
alma.acs.tmcdb.AlarmDefinition child = getAlarmDefinition(session, config, link.getChild().getAlarmDefinition(), true);
alma.acs.tmcdb.ReductionLink remoteLink = (alma.acs.tmcdb.ReductionLink)session.createCriteria(alma.acs.tmcdb.ReductionLink.class).
add(Restrictions.eq("alarmDefinitionByParentalarmdefid", parent)).
add(Restrictions.eq("alarmDefinitionByChildalarmdefid", child)).uniqueResult();
if (remoteLink == null) {
remoteLink = new alma.acs.tmcdb.ReductionLink();
remoteLink.setAlarmDefinitionByChildalarmdefid(child);
remoteLink.setAlarmDefinitionByParentalarmdefid(parent);
remoteLink.setConfiguration(config);
}
remoteLink.setAction(action);
remoteLink.setType(ReductionLinkType.valueOf(link.getType().toString()));
session.saveOrUpdate(remoteLink);
}
// and commit
session.getTransaction().commit();
session.clear();
session.beginTransaction();
}
// NODE: only FF, FM and FC are checked, and they must be non-null (XSD)
private static class ADWrapper
{
private final alma.alarmsystem.alarmmessage.generated.AlarmDefinition ad;
public ADWrapper(alma.alarmsystem.alarmmessage.generated.AlarmDefinition ad)
{
this.ad = ad;
}
@Override
public int hashCode()
{
return 213 * ad.getFaultFamily().hashCode() + 17 * ad.getFaultMember().hashCode() + ad.getFaultCode();
}
@Override
public boolean equals(Object object)
{
if (!(object instanceof ADWrapper))
return false;
ADWrapper other = (ADWrapper)object;
return
ad.getFaultFamily().equals(other.ad.getFaultFamily()) &&
ad.getFaultMember().equals(other.ad.getFaultMember()) &&
ad.getFaultCode() == other.ad.getFaultCode();
}
@Override
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("FF: ").append(ad.getFaultFamily()).append(", FM: ").append(ad.getFaultMember()).append(", FC:").append(ad.getFaultCode());
return sb.toString();
}
}
static Map<ADWrapper, alma.acs.tmcdb.AlarmDefinition> adCache = new HashMap<ADWrapper, alma.acs.tmcdb.AlarmDefinition>();
private static alma.acs.tmcdb.AlarmDefinition getAlarmDefinition(Session session, Configuration config, alma.alarmsystem.alarmmessage.generated.AlarmDefinition alarmDef, boolean allowFMCreation)
{
// cache check
ADWrapper wrappedAD = new ADWrapper(alarmDef);
alma.acs.tmcdb.AlarmDefinition cachedAD = adCache.get(wrappedAD);
if (cachedAD != null)
return cachedAD;
alma.acs.tmcdb.AlarmDefinition alarm = (alma.acs.tmcdb.AlarmDefinition)session.createCriteria(alma.acs.tmcdb.AlarmDefinition.class).
add(Restrictions.eq("faultFamily", alarmDef.getFaultFamily())).
add(Restrictions.eq("faultMember", alarmDef.getFaultMember())).
add(Restrictions.eq("faultCode", String.valueOf(alarmDef.getFaultCode()))).uniqueResult(); // TODO remove
if (alarm == null)
{
alarm = new alma.acs.tmcdb.AlarmDefinition();
alarm.setConfiguration(config);
alarm.setFaultFamily(alarmDef.getFaultFamily());
alarm.setFaultMember(alarmDef.getFaultMember());
alarm.setFaultCode(String.valueOf(alarmDef.getFaultCode())); // TODO remove
session.persist(alarm);
}
// put to cache
adCache.put(wrappedAD, alarm);
return alarm;
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#importEpilogue(org.hibernate.Session, alma.acs.tmcdb.Configuration, com.cosylab.cdb.client.CDBAccess)
*/
public void importEpilogue(Session session, Configuration config, final CDBAccess cdbAccess) {
try
{
m_logger.config("Importing ACS Alarm System configuration...");
ConfigurationAccessor conf = new ConfigurationAccessor()
{
public String getConfiguration(String path) throws Exception {
return cdbAccess.getDAL().get_DAO(path);
}
public boolean isWriteable() {
return false;
}
public void setConfiguration(String path, String data) throws Exception {
// noop
}
public void deleteConfiguration(String path) throws Exception {
// noop
}
};
importAlarms(session, config, conf, m_logger);
}
catch (Throwable th)
{
// ugly but...
if (th.getMessage() != null && th.getMessage().startsWith("Couldn't read alarm"))
{
m_logger.warning("Alarm system configuration could not be read, skipping...");
}
else
m_logger.log(Level.SEVERE, "Failed to import all the alarm data.", th);
}
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#importPrologue(org.hibernate.Session, alma.acs.tmcdb.Configuration, com.cosylab.cdb.client.CDBAccess)
*/
public void importPrologue(Session session, Configuration config, CDBAccess cdbAccess) {
// noop
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#loadControlDevices(org.hibernate.Session, alma.acs.tmcdb.Configuration, com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin.ControlDeviceBindCallback)
*/
public void loadControlDevices(Session session, Configuration config, ControlDeviceBindCallback bindCallback) {
// noop
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#controlDeviceImportEpilogue(org.hibernate.Session, alma.acs.tmcdb.Configuration, com.cosylab.cdb.client.CDBAccess, java.lang.String, alma.TMCDB.generated.Component)
*/
public void controlDeviceImportEpilogue(Session session, Configuration config,
CDBAccess cdbAccess, String componentName, Component component) {
// noop
}
private static final alma.TMCDB.alarm.Location getLocation(Session session, Location loc)
{
if (loc != null)
{
return new alma.TMCDB.alarm.Location(
loc.getBuilding(),
loc.getFloor(),
loc.getRoom(),
loc.getMnemonic(),
loc.getLocationPosition()
);
}
else
return null;
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#loadEpilogue(org.hibernate.Session, alma.acs.tmcdb.Configuration, java.util.Map)
*/
public void loadEpilogue(Session session, Configuration config, Map<String, Object> rootMap) {
loadEpilogue(session, config, rootMap, m_logger);
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#loadEpilogue(org.hibernate.Session, alma.acs.tmcdb.Configuration, java.util.Map)
*/
@SuppressWarnings("unchecked")
public static void loadEpilogue(Session session, Configuration config, Map<String, Object> rootMap, Logger m_logger) {
try
{
DOMConfigurationAccessor conf = new DOMConfigurationAccessor();
conf.setSession(session);
Map<String, Object> alarmsRoot = new RootMap<String, Object>();
Map<String, Object> administrativeRoot = new RootMap<String, Object>();
alarmsRoot.put("Administrative", administrativeRoot);
administrativeRoot.put("AlarmSystemConfiguration", new AlarmSystemConfiguration());
Categories categoriesMap = new Categories(session, config, conf, rootMap, m_logger);
administrativeRoot.put("Categories", categoriesMap);
conf.put(Categories.CATEGORY_DEFINITION_PATH, categoriesMap);
// categories
int counter = 0;
List<AlarmCategory> categories = session.createCriteria(AlarmCategory.class).add(Restrictions.eq("configuration", config)).list();
for (AlarmCategory category : categories)
{
ArrayList<String> families = new ArrayList<String>();
for (FaultFamily family : category.getFaultFamilies())
families.add(family.getFamilyName());
categoriesMap.put("category" + String.valueOf(counter++),
new alma.TMCDB.alarm.Category(
category.getPath(),
category.getDescription(),
category.getIsDefault(),
families.toArray(new String[families.size()])));
}
// fault families
Map<String, alma.TMCDB.alarm.FaultFamily> faultFamiliesMap = new FaultFamiliesMap(session, config, conf, rootMap, m_logger);
alarmsRoot.put("AlarmDefinitions", faultFamiliesMap);
conf.put(FaultFamiliesMap.ALARM_CATEGORY_DEFINITION_PATH, faultFamiliesMap);
counter = 0;
List<FaultFamily> families = session.createCriteria(FaultFamily.class).add(Restrictions.eq("configuration", config)).addOrder(Order.asc("familyName")).list();
for (FaultFamily family : families)
{
Contact contact = family.getContact();
alma.TMCDB.alarm.FaultFamily faultFamily =
new alma.TMCDB.alarm.FaultFamily(
family.getFamilyName(),
family.getAlarmSource(),
family.getHelpURL(),
new alma.TMCDB.alarm.Contact(
contact.getContactName(),
contact.getEmail(),
contact.getGsm()));
faultFamiliesMap.put("fault-family" + String.valueOf(counter++), faultFamily);
// fault codes
int codeCounter = 0;
List<FaultCode> faultCodes = session.createCriteria(FaultCode.class).
add(Restrictions.eq("faultFamily", family)).list();
for (FaultCode faultCode : faultCodes)
{
faultFamily._.put("fault-code" + String.valueOf(codeCounter++),
new alma.TMCDB.alarm.FaultCode(
faultCode.getCodeValue(),
faultCode.getIsInstant(),
faultCode.getPriority(),
faultCode.getCause(),
faultCode.getAction(),
faultCode.getConsequence(),
faultCode.getProblemDescription()));
}
// default fault member
DefaultMember defaultMember = (DefaultMember)session.createCriteria(DefaultMember.class).
add(Restrictions.eq("faultFamily", family)).uniqueResult();
if (defaultMember != null)
{
alma.TMCDB.alarm.Location location = getLocation(session, defaultMember.getLocation());
faultFamily._.put("fault-member-default", new FaultMemberDefault(location));
}
// fault members
int faultMemberCounter = 0;
List<FaultMember> faultMembers = session.createCriteria(FaultMember.class).
add(Restrictions.eq("faultFamily", family)).list();
for (FaultMember faultMember : faultMembers)
{
alma.TMCDB.alarm.Location location = getLocation(session, faultMember.getLocation());
faultFamily._.put("fault-member" + String.valueOf(faultMemberCounter++),
new alma.TMCDB.alarm.FaultMember(faultMember.getMemberName(), location));
}
}
// reductions
ReductionDefinitions redDefs = new ReductionDefinitions(session, config, conf, rootMap, m_logger);
administrativeRoot.put("ReductionDefinitions", redDefs);
int linkCount = 0;
List<alma.acs.tmcdb.ReductionLink> links = session.createCriteria(alma.acs.tmcdb.ReductionLink.class).add(Restrictions.eq("configuration", config)).list();
for (alma.acs.tmcdb.ReductionLink link : links)
{
alma.acs.tmcdb.AlarmDefinition parent = link.getAlarmDefinitionByParentalarmdefid();
alma.acs.tmcdb.AlarmDefinition child = link.getAlarmDefinitionByChildalarmdefid();
ReductionLinks toLink;
if (link.getAction() == ReductionLinkAction.CREATE)
toLink = redDefs.getLinksToCreate();
else if (link.getAction() == ReductionLinkAction.REMOVE)
toLink = redDefs.getLinksToRemove();
else
throw new RuntimeException("unsupported reduction link action '" + link.getAction() + "' for ReductionLink with id: " + link.getReductionLinkId());
toLink._.put("link" + (linkCount++),
new ReductionLink(link.getType().toString(),
new AlarmDefinition(
parent.getFaultFamily(),
parent.getFaultMember(),
parent.getFaultCode()),
new AlarmDefinition(
child.getFaultFamily(),
child.getFaultMember(),
child.getFaultCode())
));
}
int thresholdCount = 0;
List<alma.acs.tmcdb.ReductionThreshold> thresholds = session.createCriteria(alma.acs.tmcdb.ReductionThreshold.class).add(Restrictions.eq("configuration", config)).list();
for (alma.acs.tmcdb.ReductionThreshold threshold : thresholds)
{
alma.acs.tmcdb.AlarmDefinition alarm = threshold.getAlarmDefinition();
redDefs.getThresholds()._.put("threshold" + (thresholdCount++),
new alma.TMCDB.alarm.ReductionThreshold(threshold.getValue(),
new AlarmDefinition(
alarm.getFaultFamily(),
alarm.getFaultMember(),
alarm.getFaultCode())
));
}
// alarm configuration
rootMap.put("Alarms", alarmsRoot);
}
catch (Throwable th)
{
m_logger.log(Level.SEVERE, "Failed to load all the alarm data.", th);
}
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#loadPrologue(org.hibernate.Session, alma.acs.tmcdb.Configuration, java.util.Map)
*/
public void loadPrologue(Session session, Configuration config, Map<String, Object> rootMap) {
// noop
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#updateControlDevices(org.hibernate.Session, alma.acs.tmcdb.Configuration, com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin.ControlDeviceBindCallback)
*/
public void updateControlDevices(Session session, Configuration config, ControlDeviceBindCallback bindCallback, String curl) {
// noop
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#updateEpilogue(org.hibernate.Session, alma.acs.tmcdb.Configuration, java.util.Map)
*/
public void updateEpilogue(Session session, Configuration config, Map<String, Object> rootMap, String curl) {
//updateEpilogue(session, config, rootMap, m_logger, curl);
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#updateEpilogue(org.hibernate.Session, alma.acs.tmcdb.Configuration, java.util.Map)
*/
@SuppressWarnings("unchecked")
public static void updateEpilogue(Session session, Configuration config, Map<String, Object> rootMap, Logger m_logger, String curl) {
if(!curl.startsWith("Alarms"))
return;
else if(curl.matches("Alarms")) {
loadEpilogue(session, config, rootMap, m_logger);
return;
}
String c = curl.replaceFirst("Alarms/", "");
try
{
DOMConfigurationAccessor conf = new DOMConfigurationAccessor();
conf.setSession(session);
Map<String, Object> alarmsRoot = new RootMap<String, Object>();
Map<String, Object> administrativeRoot = new RootMap<String, Object>();
alarmsRoot.put("Administrative", administrativeRoot);
administrativeRoot.put("AlarmSystemConfiguration", new AlarmSystemConfiguration());
Categories categoriesMap = new Categories(session, config, conf, rootMap, m_logger);
administrativeRoot.put("Categories", categoriesMap);
conf.put(Categories.CATEGORY_DEFINITION_PATH, categoriesMap);
// categories
int counter = 0;
List<AlarmCategory> categories = session.createCriteria(AlarmCategory.class).add(Restrictions.eq("configuration", config)).list();
for (AlarmCategory category : categories)
{
ArrayList<String> families = new ArrayList<String>();
for (FaultFamily family : category.getFaultFamilies())
families.add(family.getFamilyName());
categoriesMap.put("category" + String.valueOf(counter++),
new alma.TMCDB.alarm.Category(
category.getPath(),
category.getDescription(),
category.getIsDefault(),
families.toArray(new String[families.size()])));
}
// fault families
Map<String, alma.TMCDB.alarm.FaultFamily> faultFamiliesMap = new FaultFamiliesMap(session, config, conf, rootMap, m_logger);
alarmsRoot.put("AlarmDefinitions", faultFamiliesMap);
conf.put(FaultFamiliesMap.ALARM_CATEGORY_DEFINITION_PATH, faultFamiliesMap);
counter = 0;
List<FaultFamily> families = session.createCriteria(FaultFamily.class).add(Restrictions.eq("configuration", config)).addOrder(Order.asc("familyName")).list();
for (FaultFamily family : families)
{
Contact contact = family.getContact();
alma.TMCDB.alarm.FaultFamily faultFamily =
new alma.TMCDB.alarm.FaultFamily(
family.getFamilyName(),
family.getAlarmSource(),
family.getHelpURL(),
new alma.TMCDB.alarm.Contact(
contact.getContactName(),
contact.getEmail(),
contact.getGsm()));
faultFamiliesMap.put("fault-family" + String.valueOf(counter++), faultFamily);
// fault codes
int codeCounter = 0;
List<FaultCode> faultCodes = session.createCriteria(FaultCode.class).
add(Restrictions.eq("faultFamily", family)).list();
for (FaultCode faultCode : faultCodes)
{
faultFamily._.put("fault-code" + String.valueOf(codeCounter++),
new alma.TMCDB.alarm.FaultCode(
faultCode.getCodeValue(),
faultCode.getIsInstant(),
faultCode.getPriority(),
faultCode.getCause(),
faultCode.getAction(),
faultCode.getConsequence(),
faultCode.getProblemDescription()));
}
// default fault member
DefaultMember defaultMember = (DefaultMember)session.createCriteria(DefaultMember.class).
add(Restrictions.eq("faultFamily", family)).uniqueResult();
if (defaultMember != null)
{
alma.TMCDB.alarm.Location location = getLocation(session, defaultMember.getLocation());
faultFamily._.put("fault-member-default", new FaultMemberDefault(location));
}
// fault members
int faultMemberCounter = 0;
List<FaultMember> faultMembers = session.createCriteria(FaultMember.class).
add(Restrictions.eq("faultFamily", family)).list();
for (FaultMember faultMember : faultMembers)
{
alma.TMCDB.alarm.Location location = getLocation(session, faultMember.getLocation());
faultFamily._.put("fault-member" + String.valueOf(faultMemberCounter++),
new alma.TMCDB.alarm.FaultMember(faultMember.getMemberName(), location));
}
}
// reductions
ReductionDefinitions redDefs = new ReductionDefinitions(session, config, conf, rootMap, m_logger);
administrativeRoot.put("ReductionDefinitions", redDefs);
int linkCount = 0;
List<alma.acs.tmcdb.ReductionLink> links = session.createCriteria(alma.acs.tmcdb.ReductionLink.class).add(Restrictions.eq("configuration", config)).list();
for (alma.acs.tmcdb.ReductionLink link : links)
{
alma.acs.tmcdb.AlarmDefinition parent = link.getAlarmDefinitionByParentalarmdefid();
alma.acs.tmcdb.AlarmDefinition child = link.getAlarmDefinitionByChildalarmdefid();
ReductionLinks toLink;
if (link.getAction() == ReductionLinkAction.CREATE)
toLink = redDefs.getLinksToCreate();
else if (link.getAction() == ReductionLinkAction.REMOVE)
toLink = redDefs.getLinksToRemove();
else
throw new RuntimeException("unsupported reduction link action '" + link.getAction() + "' for ReductionLink with id: " + link.getReductionLinkId());
toLink._.put("link" + (linkCount++),
new ReductionLink(link.getType().toString(),
new AlarmDefinition(
parent.getFaultFamily(),
parent.getFaultMember(),
parent.getFaultCode()),
new AlarmDefinition(
child.getFaultFamily(),
child.getFaultMember(),
child.getFaultCode())
));
}
int thresholdCount = 0;
List<alma.acs.tmcdb.ReductionThreshold> thresholds = session.createCriteria(alma.acs.tmcdb.ReductionThreshold.class).add(Restrictions.eq("configuration", config)).list();
for (alma.acs.tmcdb.ReductionThreshold threshold : thresholds)
{
alma.acs.tmcdb.AlarmDefinition alarm = threshold.getAlarmDefinition();
redDefs.getThresholds()._.put("threshold" + (thresholdCount++),
new alma.TMCDB.alarm.ReductionThreshold(threshold.getValue(),
new AlarmDefinition(
alarm.getFaultFamily(),
alarm.getFaultMember(),
alarm.getFaultCode())
));
}
// alarm configuration
rootMap.put("Alarms", alarmsRoot);
}
catch (Throwable th)
{
m_logger.log(Level.SEVERE, "Failed to update all the alarm data.", th);
}
}
/* (non-Javadoc)
* @see com.cosylab.cdb.jdal.hibernate.plugin.HibernateWDALPlugin#updatePrologue(org.hibernate.Session, alma.acs.tmcdb.Configuration, java.util.Map)
*/
public void updatePrologue(Session session, Configuration config, Map<String, Object> rootMap, String curl) {
// noop
}
public String[] getCreateTablesScriptList(String backend) {
return null;
}
}