package org.rhq.enterprise.server.resource.metadata; import java.util.Set; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.event.EventDefinition; import org.rhq.core.domain.resource.ResourceType; import org.rhq.enterprise.server.RHQConstants; import org.rhq.enterprise.server.event.EventManagerLocal; @Stateless public class EventMetadataManagerBean implements EventMetdataManagerLocal { private static Log log = LogFactory.getLog(EventMetadataManagerBean.class); @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME) private EntityManager entityMgr; @EJB private EventManagerLocal eventMgr; @Override @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void updateMetadata(ResourceType existingType, ResourceType newType) { log.debug("Updating event definitions for " + existingType); existingType = entityMgr.find(ResourceType.class, existingType.getId()); Set<EventDefinition> newEventDefs = newType.getEventDefinitions(); // Loop over the newEventDefs and set the resourceTypeId, so equals() will work for (EventDefinition def : newEventDefs) { def.setResourceTypeId(existingType.getId()); } Set<EventDefinition> existingEventDefs = existingType.getEventDefinitions(); for (EventDefinition def : existingEventDefs) { entityMgr.refresh(def); } Set<EventDefinition> toDelete = CollectionsUtil.missingInFirstSet(newEventDefs, existingEventDefs); Set<EventDefinition> newOnes = CollectionsUtil.missingInFirstSet(existingEventDefs, newEventDefs); Set<EventDefinition> toUpdate = CollectionsUtil.intersection(newEventDefs, existingEventDefs); if (log.isDebugEnabled()) { log.debug("Event definitions to be added: " + newOnes); log.debug("Event defininitions to be updated: " + toUpdate); log.debug("Event definitions to be removed: " + toDelete); } // update existing ones for (EventDefinition eDef : existingEventDefs) { for (EventDefinition nDef : toUpdate) { if (eDef.equals(nDef)) { eDef.setDescription(nDef.getDescription()); eDef.setDisplayName(nDef.getDisplayName()); } } } // Persist new definitions for (EventDefinition eDef : newOnes) { EventDefinition e2 = new EventDefinition(existingType, eDef.getName()); e2.setDescription(eDef.getDescription()); e2.setDisplayName(eDef.getDisplayName()); entityMgr.persist(e2); existingType.addEventDefinition(e2); } // and finally remove deleted ones. First flush the EM to be on the save side // for a bulk delete. existingEventDefs.removeAll(toDelete); entityMgr.flush(); for (EventDefinition eDef : toDelete) { // remove EventSources and events on it. eventMgr.deleteEventSourcesForDefinition(eDef); entityMgr.remove(eDef); } } }