/* * ALMA - Atacama Large Millimiter Array * (c) European Southern Observatory, 2011 * Copyright by ESO (in the framework of the ALMA collaboration), * and Cosylab * 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 alma.alarmsystem.alarmmessage; import java.io.StringWriter; import java.sql.Time; import java.sql.Timestamp; import java.text.ParseException; import java.util.Date; import java.util.HashSet; import java.util.Properties; import java.util.Set; import java.util.Iterator; import java.io.StringReader; import java.util.Enumeration; import alma.alarmsystem.alarmmessage.generated.*; import org.exolab.castor.xml.ValidationException; import org.exolab.castor.xml.MarshalException; import cern.laser.business.data.Location; import cern.laser.business.data.Building; import cern.laser.business.data.ResponsiblePerson; import cern.laser.business.data.Source; import cern.laser.business.data.SourceStatus; import cern.laser.business.data.Triplet; import cern.laser.business.data.StatusImpl; import cern.laser.business.data.AlarmImpl; import cern.laser.business.data.CategoryImpl; import alma.acs.util.IsoDateFormat; /** * This class manages the conversion between the ACSAlarmMessage * class generated by castor and the AlarmImpl classes in laser-core and * laser-source. * It contains other utility methods related to the generated code as well. * * * @author acaproni * */ public class AlarmMessageConversion { /** * Take a (laser-core) alarm and returns its XML representation * generated by castor * * @param coreAlarm An AlarmImpl in the laser-core * @return The XML representation of the alarm */ public static synchronized String getXML(AlarmImpl coreAlarm) throws ValidationException, MarshalException { if (coreAlarm==null) { throw new IllegalArgumentException(); } // Build an ACSAlarmMessage object ACSAlarmMessage acsAlarm = new ACSAlarmMessage(); // Fill the simple fields of the ACSAlarmMessage acsAlarm.setAlarmId(coreAlarm.getAlarmId()); acsAlarm.setSystemName(coreAlarm.getSystemName()); acsAlarm.setIdent(coreAlarm.getIdentifier()); acsAlarm.setProblemDescription(coreAlarm.getProblemDescription()); if (coreAlarm.getPriority()!=null) { acsAlarm.setPriority(coreAlarm.getPriority().intValue()); } acsAlarm.setCause(coreAlarm.getCause()); acsAlarm.setAction(coreAlarm.getAction()); acsAlarm.setConsequence(coreAlarm.getConsequence()); acsAlarm.setPiquetGSM(coreAlarm.getPiquetGSM()); acsAlarm.setPiquetEmail(coreAlarm.getPiquetEmail()); acsAlarm.setHelpURLString(coreAlarm.getHelpURLString()); if (coreAlarm.getInstant()!=null) { acsAlarm.setInstant(coreAlarm.getInstant().booleanValue()); } if (coreAlarm.getMultiplicityThreshold()!=null) { acsAlarm.setMultiplicityThreshold(coreAlarm.getMultiplicityThreshold().intValue()); } // Fill the other fields acsAlarm.setTriplet(createACSTriplet(coreAlarm.getTriplet())); acsAlarm.setSource(createACSSource(coreAlarm.getSource())); acsAlarm.setResponsiblePerson(createACSResponsiblePerson(coreAlarm.getResponsiblePerson())); // NodeParentIds if (coreAlarm.getNodeParentIds()!=null) { Iterator iter = coreAlarm.getNodeParentIds().iterator(); acsAlarm.clearNodeParentIds(); while (iter.hasNext()) { acsAlarm.addNodeParentIds(iter.next().toString()); } } // NodeChildrenIds if (coreAlarm.getNodeChildrenIds()!=null) { Iterator iter = coreAlarm.getNodeChildrenIds().iterator(); acsAlarm.clearNodeChildrenIds(); while (iter.hasNext()) { acsAlarm.addNodeChildrenIds(iter.next().toString()); } } // MultiplicityChildrenIds if (coreAlarm.getMultiplicityChildrenIds()!=null) { Iterator iter = coreAlarm.getMultiplicityChildrenIds().iterator(); acsAlarm.clearMultiplicityChildrenIds(); while (iter.hasNext()) { acsAlarm.addMultiplicityChildrenIds(iter.next().toString()); } } // MultiplicityParentIds if (coreAlarm.getMultiplicityParentIds()!=null) { Iterator iter = coreAlarm.getMultiplicityParentIds().iterator(); acsAlarm.clearMultiplicityParentIds(); while (iter.hasNext()) { acsAlarm.addMultiplicityParentIds(iter.next().toString()); } } acsAlarm.setLocation(createACSLocation(coreAlarm.getLocation())); acsAlarm.setStatus(createACSStatus((cern.laser.business.data.StatusImpl)coreAlarm.getStatus())); //////////////////////////////////////////////// if (coreAlarm.getCategories()!=null && coreAlarm.getCategories().size()>0) { ACSCategory[] categories = new ACSCategory[coreAlarm.getCategories().size()]; int pos=0; Iterator iter = coreAlarm.getCategories().iterator(); while (iter.hasNext()) { categories[pos++]=createACSCategory((cern.laser.business.data.CategoryImpl)iter.next()); } acsAlarm.setCategories(categories); } acsAlarm.setNodeParent(coreAlarm.hasNodeChildren()); acsAlarm.setMultiplicityParent(coreAlarm.hasMultiplicityChildren()); acsAlarm.setNodeChild(coreAlarm.hasNodeParents()); acsAlarm.setMultiplicityChild(coreAlarm.hasMultiplicityParents()); // Generate the XML StringWriter strWriter = new StringWriter(); acsAlarm.marshal(strWriter); return strWriter.toString(); } /** * Generate an ACSSource object from a (laser-core) Source * * @param coreSource The laser-core Source * @return The ACSource */ private static ACSSource createACSSource(Source coreSource) { if (coreSource==null) { return null; } ACSSource source = new ACSSource(); source.setSourceId(coreSource.getSourceId()); source.setDescription(coreSource.getDescription()); if (coreSource.getConnectionTimeout()!=null) { source.setConnectionTimeout(coreSource.getConnectionTimeout().intValue()); } source.setSurveillanceAlarmId(coreSource.getSurveillanceAlarmId()); source.setHostName(coreSource.getHostName()); source.setSourceStatus(createACSSourceStatus(coreSource.getStatus())); source.setResponsiblePerson(createACSResponsiblePerson(coreSource.getResponsiblePerson())); source.setAlarmIds(setToArrayOfString(coreSource.getAlarmIds())); return source; } /** * Generate an ISO 8601 string from a java.sql.Timestamp * * @param sqlStamp The java.sql.Timestamp * @return The ACSTimestamp */ private static String createACSTimestamp(Timestamp sqlStamp) { if (sqlStamp==null) { return null; } return IsoDateFormat.formatDate(new Date(sqlStamp.getTime())); } /** * Generate an ACSSourceStatus from a cern.laser.business.data.SourceStatus * * @param coreSourceStatus The cern.laser.business.data.SourceStatus * @return The ACSSourceStatus */ private static ACSSourceStatus createACSSourceStatus(SourceStatus coreSourceStatus) { if (coreSourceStatus==null) { return null; } ACSSourceStatus sourceStatus = new ACSSourceStatus(); sourceStatus.setStatusId(coreSourceStatus.getStatusId()); if (coreSourceStatus.getConnected()!=null) { sourceStatus.setConnected(coreSourceStatus.getConnected().booleanValue()); } if (coreSourceStatus.getEnabled()!=null) { sourceStatus.setEnabled(coreSourceStatus.getEnabled().booleanValue()); } sourceStatus.setLastContact(createACSTimestamp(coreSourceStatus.getLastContact())); return sourceStatus; } /** * Generate an ACSResponsiblePerson from a cern.laser.business.data.ResponsiblePerson * * @param coreSourceStatus The cern.laser.business.data.ResponsiblePerson * @return The ACSResponsiblePerson */ private static ACSResponsiblePerson createACSResponsiblePerson(ResponsiblePerson coreResponsible) { if (coreResponsible==null) { return null; } ACSResponsiblePerson responsible = new ACSResponsiblePerson(); if (coreResponsible.getResponsibleId()!=null) { responsible.setResponsibleId(coreResponsible.getResponsibleId().intValue()); } responsible.setFirstName(coreResponsible.getFirstName()); responsible.setFamilyName(coreResponsible.getFamilyName()); responsible.setEMail(coreResponsible.getEMail()); responsible.setGsmNumber(coreResponsible.getGsmNumber()); responsible.setPhoneNumber(coreResponsible.getPhoneNumber()); return responsible; } /** * Generate an ACSTriplet from a cern.laser.business.data.Triple * * @param coreSourceStatus The cern.laser.business.data.Triplet * @return The ACSTriplet */ private static ACSTriplet createACSTriplet(Triplet coreTriplet) { if (coreTriplet==null) { return null; } ACSTriplet triplet = new ACSTriplet(); if (coreTriplet.getFaultCode()!=null) { triplet.setFaultCode(coreTriplet.getFaultCode().intValue()); } triplet.setFaultFamily(coreTriplet.getFaultFamily()); triplet.setFaultMember(coreTriplet.getFaultMember()); return triplet; } /** * Generate an ACSBuilding from a cern.laser.business.data.Building * * @param coreSourceStatus The cern.laser.business.data.Building * @return The ACSBuilding */ private static ACSBuilding createACSBuilding(Building coreBuilding) { if (coreBuilding==null) { return null; } ACSBuilding building = new ACSBuilding(); building.setBuildingNumber(coreBuilding.getBuildingNumber()); building.setSite(coreBuilding.getSite()); if (coreBuilding.getZone()!=null) { building.setZone(coreBuilding.getZone().intValue()); } building.setMap(coreBuilding.getMap()); return building; } /** * Generate an ACSLocation from a cern.laser.business.data.Location * * @param coreSourceStatus The cern.laser.business.data.Location * @return The ACSLocation */ private static ACSLocation createACSLocation(Location coreLocation) { if (coreLocation==null) { return null; } ACSLocation location = new ACSLocation(); location.setLocationId(coreLocation.getLocationId()); location.setFloor(coreLocation.getFloor()); location.setRoom(coreLocation.getRoom()); location.setMnemonic(coreLocation.getMnemonic()); location.setPosition(coreLocation.getPosition()); location.setBuilding(createACSBuilding(coreLocation.getBuilding())); return location; } /** * Generate an ACSStatus from a cern.laser.business.data.StatusImpl * * @param coreSourceStatus The cern.laser.business.data.Location * @return The ACSStatus */ private static ACSStatus createACSStatus(StatusImpl coreStatus) { if (coreStatus==null) { return null; } ACSStatus status = new ACSStatus(); status.setStatusId(coreStatus.getStatusId()); if (coreStatus.getActive()!=null) { status.setActive(coreStatus.getActive().booleanValue()); } if (coreStatus.getMasked()!=null) { status.setMasked(coreStatus.getMasked().booleanValue()); } if (coreStatus.getReduced()!=null) { status.setReduced(coreStatus.getReduced().booleanValue()); } if (coreStatus.getTerminatedByBackup()!=null) { status.setTerminatedByBackup(coreStatus.getTerminatedByBackup().booleanValue()); } if (coreStatus.getActivatedByBackup()!=null) { status.setActivatedByBackup(coreStatus.getActivatedByBackup().booleanValue()); } status.setSourceTimestamp(createACSTimestamp(coreStatus.getSourceTimestamp())); status.setUserTimestamp(createACSTimestamp(coreStatus.getUserTimestamp())); status.setSystemTimestamp(createACSTimestamp(coreStatus.getSystemTimestamp())); status.setSourceHostname(coreStatus.getSourceHostname()); if (coreStatus.getProperties()!=null) { Properties coreProps = coreStatus.getProperties(); for (Enumeration coreKeys = coreProps.propertyNames(); coreKeys.hasMoreElements() ;) { String key = (String)coreKeys.nextElement(); String val = (String)coreProps.getProperty(key); ACSProperty oneProp= new ACSProperty(); oneProp.setKey(key); oneProp.setValue(val); status.addPersistentUserProperties(oneProp); } } // globalAcknowledged is not used in StatusImpl so I skip the field return status; } private static ACSCategory createACSCategory(CategoryImpl coreCategory) { if (coreCategory==null) { return null; } ACSCategory category = new ACSCategory(); category.setName(coreCategory.getName()); category.setDescription(coreCategory.getDescription()); if (coreCategory.getCategoryId()!=null) { category.setCategoryId(coreCategory.getCategoryId().intValue()); } if (coreCategory.getParentId()!=null) { category.setParentId(coreCategory.getParentId().intValue()); } category.setChildrenIds(setToArrayOfString(coreCategory.getChildrenIds())); category.setAlarmIds(setToArrayOfString(coreCategory.getAlarmIds())); category.setPath(coreCategory.getPath()); category.setIsLeaf(coreCategory.isLeaf()); return category; } /** * Converts a set of String to an array of String * * @param set The set to convert * @return The set as array of String */ private static String[] setToArrayOfString(Set set) { if (set==null) { return null; } Iterator iter = set.iterator(); String[] res = new String[set.size()]; int pos=0; Object obj=null; while (iter.hasNext()) { try { obj = iter.next(); res[pos++]=obj.toString(); } catch (ClassCastException cce) { System.err.println("*** Calls cast exception: "+cce.getMessage()); System.err.println("*** Original class is "+obj.getClass().getName()); cce.printStackTrace(); } } return res; } public static synchronized AlarmImpl getAlarm(String xml) throws ValidationException, MarshalException, ParseException { if (xml==null) { throw new IllegalArgumentException(); } StringReader strReader = new StringReader(xml); ACSAlarmMessage alarm = ACSAlarmMessage.unmarshalACSAlarmMessage(strReader); // Primitive field String alarmId = alarm.getAlarmId(); String systemName = alarm.getSystemName(); String identifier = alarm.getIdent(); String problemDescription = alarm.getProblemDescription(); Integer priority = new Integer(alarm.getPriority()); String cause = alarm.getCause(); String action = alarm.getAction(); String consequence = alarm.getConsequence(); String piquetGSM = alarm.getPiquetGSM(); String piquetEmail = alarm.getPiquetEmail(); String helpURLString = alarm.getHelpURLString(); Boolean instant = new Boolean(alarm.getInstant()); boolean nodeParent = alarm.getNodeParent(); boolean multiplicityParent = alarm.getMultiplicityParent(); boolean nodeChild = alarm.getNodeChild(); boolean multiplicityChild = alarm.getMultiplicityChild(); // The Triplet Triplet triplet = new Triplet( alarm.getTriplet().getFaultFamily(), alarm.getTriplet().getFaultMember(), new Integer(alarm.getTriplet().getFaultCode())); // The Building Building building; if (alarm.getLocation()!=null) { if (alarm.getLocation().getBuilding()!=null){ building = new Building ( alarm.getLocation().getBuilding().getBuildingNumber(), alarm.getLocation().getBuilding().getSite(), new Integer(alarm.getLocation().getBuilding().getZone()), alarm.getLocation().getBuilding().getMap()); } else { building=new Building("N/A",",N/A",0,"N/A"); } } else { building=new Building("N/A",",N/A",0,"N/A"); } // The Location Location location; if (alarm.getLocation()!=null) { location = new Location ( alarm.getLocation().getLocationId(), alarm.getLocation().getFloor(), alarm.getLocation().getMnemonic(), alarm.getLocation().getPosition(), alarm.getLocation().getRoom()); } else { location=new Location("N/A","N/A","N/A","N/A","N/A"); } location.setBuilding(building); // The ResponsiblePerson ResponsiblePerson responsiblePerson =null; if (alarm.getResponsiblePerson()!=null) { responsiblePerson = new ResponsiblePerson ( new Integer (alarm.getResponsiblePerson().getResponsibleId()), alarm.getResponsiblePerson().getFirstName(), alarm.getResponsiblePerson().getFamilyName(), alarm.getResponsiblePerson().getEMail(), alarm.getResponsiblePerson().getGsmNumber(), alarm.getResponsiblePerson().getPhoneNumber()); } // The Source Source source = new Source(); source.setSourceId(alarm.getSource().getSourceId()); source.setDescription(alarm.getSource().getDescription()); source.setConnectionTimeout(new Integer(alarm.getSource().getConnectionTimeout())); source.setSurveillanceAlarmId(alarm.getSource().getSurveillanceAlarmId()); source.setHostName(alarm.getSource().getHostName()); ResponsiblePerson responsiblePersonSrc = new ResponsiblePerson ( new Integer (alarm.getSource().getResponsiblePerson().getResponsibleId()), alarm.getSource().getResponsiblePerson().getFirstName(), alarm.getSource().getResponsiblePerson().getFamilyName(), alarm.getSource().getResponsiblePerson().getEMail(), alarm.getSource().getResponsiblePerson().getGsmNumber(), alarm.getSource().getResponsiblePerson().getPhoneNumber()); source.setResponsiblePerson(responsiblePersonSrc); HashSet set = new HashSet(); for (int pos=0; pos<alarm.getSource().getAlarmIds().length; pos++) { set.add(alarm.getSource().getAlarmIds()[pos]); } source.setAlarmIds(set); Timestamp lastContact = null; if (alarm.getSource().getSourceStatus().getLastContact()!=null) { Date date=IsoDateFormat.parseIsoTimestamp(alarm.getSource().getSourceStatus().getLastContact()); lastContact = new Timestamp(date.getTime()); } SourceStatus sourceStatus = new SourceStatus( new Boolean(alarm.getSource().getSourceStatus().getConnected()), new Boolean(alarm.getSource().getSourceStatus().getEnabled()), lastContact); source.setStatus(sourceStatus); // The Status Timestamp sourceTimestamp = new Timestamp(IsoDateFormat.parseIsoTimestamp(alarm.getStatus().getSourceTimestamp()).getTime()); Timestamp userTimestamp= new Timestamp(IsoDateFormat.parseIsoTimestamp(alarm.getStatus().getUserTimestamp()).getTime()); Timestamp systemTimestamp = new Timestamp(IsoDateFormat.parseIsoTimestamp(alarm.getStatus().getSystemTimestamp()).getTime()); // The properties ACSProperty[] props = alarm.getStatus().getPersistentUserProperties(); Properties properties = new Properties(); for (int pos=0; pos<props.length; pos++) { properties.put(props[pos].getKey(),props[pos].getValue()); } StatusImpl status = new StatusImpl( new Boolean(alarm.getStatus().getActive()), new Boolean(alarm.getStatus().getMasked()), new Boolean(alarm.getStatus().getReduced()), new Boolean(alarm.getStatus().getActivatedByBackup()), new Boolean(alarm.getStatus().getTerminatedByBackup()), alarm.getStatus().getSourceHostname(), sourceTimestamp, userTimestamp, systemTimestamp, properties); // The Categories HashSet categories = new HashSet(); for (int pos=0; pos<alarm.getCategoriesCount(); pos++) { ACSCategory cat = alarm.getCategories(pos); CategoryImpl catImpl = new CategoryImpl( new Integer(cat.getCategoryId()), cat.getName(), cat.getDescription(), cat.getPath(), cat.getIsLeaf()); catImpl.setParentId(new Integer(cat.getParentId())); HashSet alarmIds = new HashSet(); if (cat.getAlarmIdsCount()>0) { for (pos=0; pos<cat.getAlarmIdsCount(); pos++) { alarmIds.add(cat.getAlarmIds(pos)); } catImpl.setAlarmIds(alarmIds); } HashSet childrenIds = new HashSet(); if (cat.getChildrenIdsCount()>0) { for (pos=0; pos<cat.getChildrenIdsCount(); pos++) { childrenIds.add(cat.getChildrenIds(pos)); } catImpl.setChildrenIds(childrenIds); } categories.add(catImpl); } // MutiplicityChildIds (added later to alarmImpl) HashSet MultiplicityChildIds = new HashSet(); if (alarm.getMultiplicityChildrenIdsCount()>0) { for (int pos=0; pos<alarm.getMultiplicityChildrenIdsCount(); pos++) { MultiplicityChildIds.add(alarm.getMultiplicityChildrenIds(pos)); } } // MutiplicityParentIds (added later to alarmImpl) HashSet MultiplicityParentIds = new HashSet(); if (alarm.getMultiplicityParentIdsCount()>0) { for (int pos=0; pos<alarm.getMultiplicityParentIdsCount(); pos++) { MultiplicityParentIds.add(alarm.getMultiplicityParentIds(pos)); } } // NodeChildIds (added later to alarmImpl) HashSet NodeChildIds = new HashSet(); if (alarm.getNodeChildrenIdsCount()>0) { for (int pos=0; pos<alarm.getNodeChildrenIdsCount(); pos++) { NodeChildIds.add(alarm.getNodeChildrenIds(pos)); } } // NodeParentIds (added later to alarmImpl) HashSet NodeParentIds = new HashSet(); if (alarm.getNodeParentIdsCount()>0) { for (int pos=0; pos<alarm.getNodeParentIdsCount(); pos++) { NodeParentIds.add(alarm.getNodeParentIds(pos)); } } // The multiplicity threshold (added later to alarmImpl) int multiplityThreshold = alarm.getMultiplicityThreshold(); AlarmImpl alarmImpl = new AlarmImpl(alarmId, systemName, identifier, problemDescription, priority, cause, action, consequence, piquetGSM, piquetEmail, helpURLString, instant, source, location, responsiblePerson, categories, status, triplet, nodeParent, multiplicityParent, nodeChild, multiplicityChild); alarmImpl.setNodeParentIds(NodeParentIds); alarmImpl.setNodeChildrenIds(NodeChildIds); alarmImpl.setMultiplicityChildrenIds(MultiplicityChildIds); alarmImpl.setMultiplicityParentIds(MultiplicityParentIds); alarmImpl.setMultiplicityThreshold(new Integer(multiplityThreshold)); return alarmImpl; } }