package rocks.inspectit.server.instrumentation.listener;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import rocks.inspectit.server.ci.event.ProfileUpdateEvent;
import rocks.inspectit.server.instrumentation.config.AgentCacheEntry;
import rocks.inspectit.server.instrumentation.config.ConfigurationHolder;
import rocks.inspectit.server.instrumentation.config.job.AbstractConfigurationChangeJob;
import rocks.inspectit.server.instrumentation.config.job.ProfileUpdateJob;
import rocks.inspectit.shared.cs.ci.Environment;
/**
* Listener for the {@link ProfileUpdateEvent}s.
*
* @author Ivan Senic
* @author Marius Oehler
*
*/
@Component
public class ProfileEventListener extends AbstractConfigurationChangeListener<ProfileUpdateEvent> {
/**
* The used {@link ObjectFactory}.
*/
@Autowired
private ObjectFactory<ProfileUpdateJob> objectFactory;
/**
* {@inheritDoc}
*/
@Override
public void onApplicationEvent(ProfileUpdateEvent event) {
// if the profile is not active before and after update do nothing
if (!event.isProfileActive() && !event.isProfileDeactivated()) {
return;
}
List<AbstractConfigurationChangeJob> jobs = new ArrayList<>();
// look all agent cache entries if profile is contained in environment
Map<Long, AgentCacheEntry> agentCacheMap = nextGenInstrumentationManager.getAgentCacheMap();
for (AgentCacheEntry agentCacheEntry : agentCacheMap.values()) {
ConfigurationHolder configurationHolder = agentCacheEntry.getConfigurationHolder();
// if not initialized then ignore
if (!configurationHolder.isInitialized()) {
continue;
}
// if environment does not contain such profile ignore
Environment environment = configurationHolder.getEnvironment();
if (CollectionUtils.isEmpty(environment.getProfileIds()) || !environment.getProfileIds().contains(event.getProfileId())) {
continue;
}
// create and fire job
ProfileUpdateJob profileUpdateJob = objectFactory.getObject();
profileUpdateJob.setProfileUpdateEvent(event);
profileUpdateJob.setAgentCacheEntry(agentCacheEntry);
jobs.add(profileUpdateJob);
}
if (CollectionUtils.isNotEmpty(jobs)) {
executeJobs(jobs);
}
}
}