package rocks.inspectit.server.service; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import rocks.inspectit.server.dao.DefaultDataDao; import rocks.inspectit.server.dao.PlatformIdentDao; import rocks.inspectit.server.event.AgentDeletedEvent; import rocks.inspectit.server.spring.aop.MethodLog; import rocks.inspectit.server.util.AgentStatusDataProvider; import rocks.inspectit.shared.all.cmr.model.PlatformIdent; import rocks.inspectit.shared.all.communication.DefaultData; import rocks.inspectit.shared.all.communication.data.cmr.AgentStatusData; import rocks.inspectit.shared.all.communication.data.cmr.AgentStatusData.AgentConnection; import rocks.inspectit.shared.all.exception.BusinessException; import rocks.inspectit.shared.all.exception.enumeration.AgentManagementErrorCodeEnum; import rocks.inspectit.shared.all.spring.logger.Log; import rocks.inspectit.shared.cs.cmr.service.IGlobalDataAccessService; /** * @author Patrice Bouillet * */ @Service @Transactional public class GlobalDataAccessService implements IGlobalDataAccessService { /** The logger of this class. */ @Log Logger log; /** * The platform ident DAO. */ @Autowired PlatformIdentDao platformIdentDao; /** * The default data DAO. */ @Autowired DefaultDataDao defaultDataDao; /** * {@link AgentStatusDataProvider}. */ @Autowired AgentStatusDataProvider agentStatusProvider; /** * Event publisher. */ @Autowired ApplicationEventPublisher eventPublisher; /** * {@inheritDoc} */ @Override @MethodLog public Map<PlatformIdent, AgentStatusData> getAgentsOverview() { List<PlatformIdent> agents = platformIdentDao.findAll(); Map<Long, AgentStatusData> agentStatusMap = agentStatusProvider.getAgentStatusDataMap(); Map<PlatformIdent, AgentStatusData> resultMap = new HashMap<>(); for (PlatformIdent platformIdent : agents) { AgentStatusData status = agentStatusMap.get(platformIdent.getId()); if (null == status) { status = new AgentStatusData(AgentConnection.NEVER_CONNECTED); } resultMap.put(platformIdent, status); } return resultMap; } /** * {@inheritDoc} */ @Override @MethodLog public PlatformIdent getCompleteAgent(long id) throws BusinessException { PlatformIdent platformIdent = platformIdentDao.findInitialized(id); if (null != platformIdent) { return platformIdent; } else { throw new BusinessException("Load the agent with ID=" + id + ".", AgentManagementErrorCodeEnum.AGENT_DOES_NOT_EXIST); } } /** * * {@inheritDoc} */ @Override @MethodLog public void deleteAgent(long platformId) throws BusinessException { PlatformIdent platformIdent = platformIdentDao.load(platformId); if (null != platformIdent) { AgentStatusData agentStatusData = agentStatusProvider.getAgentStatusDataMap().get(platformIdent.getId()); // delete is allowed only if agent is disconnected or was never connected if ((null != agentStatusData) && (agentStatusData.getAgentConnection() == AgentConnection.CONNECTED)) { throw new BusinessException("Delete the agent '" + platformIdent.getAgentName() + "'.", AgentManagementErrorCodeEnum.AGENT_CAN_NOT_BE_DELETED); } platformIdentDao.delete(platformIdent); defaultDataDao.deleteAll(platformIdent.getId()); AgentDeletedEvent event = new AgentDeletedEvent(this, platformIdent.getId()); eventPublisher.publishEvent(event); log.info("The Agent '" + platformIdent.getAgentName() + "' with the ID " + platformIdent.getId() + " was successfully deleted from the CMR."); } else { throw new BusinessException("Delete the agent with the ID=" + platformId + ".", AgentManagementErrorCodeEnum.AGENT_DOES_NOT_EXIST); } } /** * {@inheritDoc} */ @Override @MethodLog public List<DefaultData> getLastDataObjects(DefaultData template, long timeInterval) { List<DefaultData> result = defaultDataDao.findByExampleWithLastInterval(template, timeInterval); return result; } /** * {@inheritDoc} */ @Override @MethodLog public DefaultData getLastDataObject(DefaultData template) { DefaultData result = defaultDataDao.findByExampleLastData(template); return result; } /** * {@inheritDoc} */ @Override @MethodLog public List<? extends DefaultData> getDataObjectsFromToDate(DefaultData template, Date fromDate, Date toDate) { if (fromDate.after(toDate)) { return Collections.emptyList(); } List<DefaultData> result = defaultDataDao.findByExampleFromToDate(template, fromDate, toDate); return result; } /** * {@inheritDoc} */ @Override @MethodLog public List<? extends DefaultData> getTemplatesDataObjectsFromToDate(Collection<DefaultData> templates, Date fromDate, Date toDate) { if (fromDate.after(toDate)) { return Collections.emptyList(); } List<DefaultData> result = new ArrayList<>(); for (DefaultData template : templates) { result.addAll(this.getDataObjectsFromToDate(template, fromDate, toDate)); } return result; } /** * {@inheritDoc} */ @Override @MethodLog public List<DefaultData> getDataObjectsSinceId(DefaultData template) { List<DefaultData> result = defaultDataDao.findByExampleSinceId(template); return result; } /** * {@inheritDoc} */ @Override @MethodLog public List<DefaultData> getDataObjectsSinceIdIgnoreMethodId(DefaultData template) { List<DefaultData> result = defaultDataDao.findByExampleSinceIdIgnoreMethodId(template); return result; } /** * Is executed after dependency injection is done to perform any initialization. * * @throws Exception * if an error occurs during {@link PostConstruct} */ @PostConstruct public void postConstruct() throws Exception { if (log.isInfoEnabled()) { log.info("|-Global Data Access Service active..."); } } }