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 javax.persistence.Query;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.OperationHistory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
@Stateless
public class OperationMetadataManagerBean implements OperationMetadataManagerLocal {
private static final Log log = LogFactory.getLog(OperationMetadataManagerBean.class);
@PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
private EntityManager entityMgr;
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void updateMetadata(ResourceType existingType, ResourceType newType) {
log.debug("Updating operation definitions for " + existingType);
existingType = entityMgr.find(ResourceType.class, existingType.getId());
Set<OperationDefinition> existingDefinitions = existingType.getOperationDefinitions();
Set<OperationDefinition> newDefinitions = newType.getOperationDefinitions();
Set<OperationDefinition> newOps = CollectionsUtil.missingInFirstSet(existingDefinitions, newDefinitions);
Set<OperationDefinition> opsToRemove = CollectionsUtil.missingInFirstSet(newDefinitions, existingDefinitions);
existingDefinitions.retainAll(newDefinitions);
if (log.isDebugEnabled()) {
log.debug("Operation definitions to be added: " + newOps);
log.debug("Operation definitions to be removed: " + opsToRemove);
log.debug("Operation definitions to be updated: " + existingDefinitions);
}
// loop over the OperationDefinitions that are neither new nor deleted
// and update them from the resourceType
for (OperationDefinition def : existingDefinitions) {
for (OperationDefinition nDef : newDefinitions) {
if (def.equals(nDef)) {
def.setDescription(nDef.getDescription());
def.setDisplayName(nDef.getDisplayName());
def.setParametersConfigurationDefinition(nDef.getParametersConfigurationDefinition());
def.setResourceVersionRange(nDef.getResourceVersionRange());
def.setResultsConfigurationDefinition(nDef.getResultsConfigurationDefinition());
def.setTimeout(nDef.getTimeout());
}
}
}
for (OperationDefinition newOp : newOps) {
existingType.addOperationDefinition(newOp); // does the back link as well
}
existingDefinitions.removeAll(opsToRemove);
for (OperationDefinition opToDelete : opsToRemove) {
// First delete history items that hang on the definition
Query q = entityMgr.createNamedQuery(OperationHistory.QUERY_DELETE_BY_DEFINITION);
q.setParameter("definition",opToDelete);
q.executeUpdate();
entityMgr.remove(opToDelete);
}
}
}