package rocks.inspectit.ui.rcp.model;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ui.progress.IElementCollector;
import com.google.common.base.Objects;
import rocks.inspectit.shared.all.cmr.model.PlatformIdent;
import rocks.inspectit.shared.all.communication.data.cmr.AgentStatusData;
import rocks.inspectit.ui.rcp.provider.ICmrRepositoryProvider;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition.OnlineStatus;
import rocks.inspectit.ui.rcp.repository.RepositoryDefinition;
/**
* This composite holds Agents of one CMR as the deferred children.
*
* @author Ivan Senic
*
*/
public class DeferredAgentsComposite extends DeferredComposite implements ICmrRepositoryProvider {
/**
* {@link CmrRepositoryDefinition}.
*/
private CmrRepositoryDefinition cmrRepositoryDefinition;
/**
* Defines if so called 'old' agents are being shown. These agents never sent data since the CMR
* started.
*/
private final boolean showOldAgents;
/**
* Default constructor.
*
* @param cmrRepositoryDefinition
* Repository.
* @param showOldAgents
* Defines if so called 'old' agents are being shown. These agents never sent data
* since the CMR started.
*/
public DeferredAgentsComposite(CmrRepositoryDefinition cmrRepositoryDefinition, boolean showOldAgents) {
this.showOldAgents = showOldAgents;
setRepositoryDefinition(cmrRepositoryDefinition);
}
/**
* {@inheritDoc}
*/
@Override
public synchronized void fetchDeferredChildren(Object object, IElementCollector collector, IProgressMonitor monitor) {
monitor.beginTask("Loading agents..", IProgressMonitor.UNKNOWN);
try {
if (cmrRepositoryDefinition.getOnlineStatus() == OnlineStatus.ONLINE) {
Map<PlatformIdent, AgentStatusData> agents = cmrRepositoryDefinition.getGlobalDataAccessService().getAgentsOverview();
if (null != agents) {
Map<PlatformIdent, AgentStatusData> filteredMap = new HashMap<>(agents.size());
for (Entry<PlatformIdent, AgentStatusData> entry : agents.entrySet()) {
PlatformIdent platformIdent = entry.getKey();
AgentStatusData agentStatusData = entry.getValue();
// the agentstatusdata is null if the agent wasn't connected before
if (showOldAgents || (!showOldAgents && (agentStatusData != null))) {
filteredMap.put(platformIdent, agentStatusData);
}
}
List<Component> components = AgentFolderFactory.getAgentFolderTree(filteredMap, cmrRepositoryDefinition);
for (Component component : components) {
collector.add(component, monitor);
((Composite) object).addChild(component);
}
}
}
} finally {
collector.done();
monitor.done();
}
}
/**
* {@inheritDoc}
*/
@Override
public final void setRepositoryDefinition(RepositoryDefinition repositoryDefinition) {
if (repositoryDefinition instanceof CmrRepositoryDefinition) {
this.cmrRepositoryDefinition = (CmrRepositoryDefinition) repositoryDefinition;
}
}
/**
* {@inheritDoc}
*/
@Override
public RepositoryDefinition getRepositoryDefinition() {
return cmrRepositoryDefinition;
}
/**
* {@inheritDoc}
*/
@Override
public CmrRepositoryDefinition getCmrRepositoryDefinition() {
return cmrRepositoryDefinition;
}
/**
* {@inheritDoc}
*/
@Override
public String getName() {
return cmrRepositoryDefinition.getName();
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(), cmrRepositoryDefinition);
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object == null) {
return false;
}
if (getClass() != object.getClass()) {
return false;
}
if (!super.equals(object)) {
return false;
}
DeferredAgentsComposite that = (DeferredAgentsComposite) object;
return Objects.equal(this.cmrRepositoryDefinition, that.cmrRepositoryDefinition);
}
}