package rocks.inspectit.ui.rcp.model;
import java.util.List;
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.MethodIdent;
import rocks.inspectit.shared.all.cmr.model.MethodIdentToSensorType;
import rocks.inspectit.shared.all.cmr.model.MethodSensorTypeIdent;
import rocks.inspectit.shared.all.util.ObjectUtils;
import rocks.inspectit.ui.rcp.editor.inputdefinition.EditorPropertiesData;
import rocks.inspectit.ui.rcp.editor.inputdefinition.InputDefinition;
import rocks.inspectit.ui.rcp.editor.inputdefinition.InputDefinition.IdDefinition;
import rocks.inspectit.ui.rcp.formatter.TextFormatter;
/**
* This composite shows only one sensor for each method of the class that has a
* {@link SensorTypeEnum} type.
*
* @author Ivan Senic
*
*/
public class FilteredDeferredClassComposite extends DeferredClassComposite {
/**
* Sensor to show.
*/
private SensorTypeEnum sensorTypeEnumToShow;
/**
* @param sensorTypeEnum
* Set the sensor type to show.
*/
public FilteredDeferredClassComposite(SensorTypeEnum sensorTypeEnum) {
this.sensorTypeEnumToShow = sensorTypeEnum;
}
/**
* {@inheritDoc}
*/
@Override
public void fetchDeferredChildren(Object object, IElementCollector collector, IProgressMonitor monitor) {
try {
List<MethodIdent> methods = getMethods();
Composite classComposite = (Composite) object;
monitor.beginTask("Loading of Method Elements...", methods.size());
for (MethodIdent method : methods) {
for (MethodIdentToSensorType methodIdentToSensorType : method.getMethodIdentToSensorTypes()) {
if (!isHideInactiveInstrumentations() || methodIdentToSensorType.isActive()) {
MethodSensorTypeIdent methodSensorTypeIdent = methodIdentToSensorType.getMethodSensorTypeIdent();
String fqn = methodSensorTypeIdent.getFullyQualifiedClassName();
SensorTypeEnum sensorTypeEnum = SensorTypeEnum.get(fqn);
if (sensorTypeEnum == sensorTypeEnumToShow) { // NOPMD
if (sensorTypeEnum.isOpenable()) {
Component targetSensorType = new Leaf();
targetSensorType.setEnabled(methodIdentToSensorType.isActive());
if (null != method.getParameters()) {
String parameters = method.getParameters().toString();
parameters = parameters.substring(1, parameters.length() - 1);
targetSensorType.setName(String.format(METHOD_FORMAT, method.getMethodName(), parameters));
} else {
targetSensorType.setName(String.format(METHOD_FORMAT, method.getMethodName(), ""));
}
targetSensorType.setImage(ModifiersImageFactory.getImage(method.getModifiers()));
InputDefinition inputDefinition = new InputDefinition();
inputDefinition.setRepositoryDefinition(getRepositoryDefinition());
inputDefinition.setId(sensorTypeEnum);
EditorPropertiesData editorPropertiesData = new EditorPropertiesData();
editorPropertiesData.setSensorImage(sensorTypeEnum.getImage());
editorPropertiesData.setSensorName(sensorTypeEnum.getDisplayName());
editorPropertiesData.setViewName(TextFormatter.getMethodString(method));
editorPropertiesData.setViewImage(ModifiersImageFactory.getImage(method.getModifiers()));
inputDefinition.setEditorPropertiesData(editorPropertiesData);
IdDefinition idDefinition = new IdDefinition();
idDefinition.setPlatformId(method.getPlatformIdent().getId());
idDefinition.setSensorTypeId(methodSensorTypeIdent.getId());
idDefinition.setMethodId(method.getId());
inputDefinition.setIdDefinition(idDefinition);
targetSensorType.setInputDefinition(inputDefinition);
collector.add(targetSensorType, monitor);
classComposite.addChild(targetSensorType);
}
break;
}
}
}
monitor.worked(1);
if (monitor.isCanceled()) {
break;
}
}
} finally {
monitor.done();
}
}
/**
* {@inheritDoc}
*/
@Override
protected boolean select(MethodIdent methodIdent) {
for (MethodIdentToSensorType methodIdentToSensorType : methodIdent.getMethodIdentToSensorTypes()) {
SensorTypeEnum sensorTypeEnum = SensorTypeEnum.get(methodIdentToSensorType.getMethodSensorTypeIdent().getFullyQualifiedClassName());
if (ObjectUtils.equals(sensorTypeEnum, sensorTypeEnumToShow)) {
return super.select(methodIdent);
}
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(), sensorTypeEnumToShow);
}
/**
* {@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;
}
FilteredDeferredClassComposite that = (FilteredDeferredClassComposite) object;
return Objects.equal(this.sensorTypeEnumToShow, that.sensorTypeEnumToShow);
}
}