package rocks.inspectit.ui.rcp.ci.view;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.part.ViewPart;
import rocks.inspectit.shared.cs.ci.business.impl.ApplicationDefinition;
import rocks.inspectit.ui.rcp.InspectIT;
import rocks.inspectit.ui.rcp.InspectITImages;
import rocks.inspectit.ui.rcp.ci.job.OpenApplicationDefinitionJob;
import rocks.inspectit.ui.rcp.ci.listener.IApplicationDefinitionChangeListener;
import rocks.inspectit.ui.rcp.model.ci.ApplicationLeaf;
import rocks.inspectit.ui.rcp.provider.IApplicationProvider;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition.OnlineStatus;
import rocks.inspectit.ui.rcp.view.IRefreshableView;
/**
* {@link ViewPart} displaying {@link ApplicationDefinition}s.
*
* @author Alexander Wert
*
*/
public class BusinessContextManagerViewPart extends ViewPart implements IRefreshableView {
/**
* View id.
*/
public static final String VIEW_ID = "rocks.inspectit.ui.rcp.ci.view.businessContextManager";
/**
* Tool tip text describing the importance of the order of application definitions.
*/
public static final String APP_ORDER_INFO_TOOLTIP = "The order of the application definitions impacts the assignment of application labeles to measurement data.\n"
+ "If there are multiple application definitions that potentially would match a measurement data object,\n" + "then this object is labeled only with the first application in order.\n"
+ "In general, application definitions with more specific matching rules should be inserted before applications that have rather generic matching rules.";
/**
* Tool tip text describing the importance of the order of business transaction definitions.
*/
public static final String B_TX_ORDER_INFO_TOOLTIP = "The order of the business transaction definitions impacts the assignment of business transaction labeles to measurement data.\n"
+ "If there are multiple business transaction definitions that potentially would match a measurement data object,\n"
+ "then this object is labeled only with the first business transaction in order.\n"
+ "In general, business transaction definitions with more specific matching rules should be inserted before business transactions that have rather generic matching rules.";
/**
* View instance.
*/
private BusinessContextManagerView managerView;
/**
* {@inheritDoc}
*/
@Override
public void createPartControl(Composite parent) {
managerView = new BusinessContextManagerView(getSite());
managerView.createControls(parent, true);
getSite().setSelectionProvider(managerView.getSelectionProviderAdapter());
}
/**
* {@inheritDoc}
*/
@Override
public void setFocus() {
managerView.setFocus();
}
/**
* {@inheritDoc}
*/
@Override
public void dispose() {
managerView.dispose();
super.dispose();
}
/**
* {@inheritDoc}
*/
@Override
public void refresh() {
managerView.refresh();
}
/**
* {@inheritDoc}
*/
@Override
public boolean canRefresh() {
return managerView.canRefresh();
}
/**
* Select application definition in the table view.
*
* @param applicationDefinition
* {@link ApplicationDefinition} to select.
* @param repositoryDefinition
* {@link CmrRepositoryDefinition} instance.
*/
public void selectApplicationDefinition(ApplicationDefinition applicationDefinition, CmrRepositoryDefinition repositoryDefinition) {
ApplicationLeaf leaf = new ApplicationLeaf(applicationDefinition, managerView.getApplications(), repositoryDefinition);
StructuredSelection selection = new StructuredSelection(leaf);
managerView.select(selection);
}
/**
* View displaying {@link ApplicationDefinition}s.
*
* @author Alexander Wert
*
*/
private static class BusinessContextManagerView extends AbstractTableBasedManagerView implements IApplicationDefinitionChangeListener {
/**
* Menu id.
*/
public static final String MENU_ID = "rocks.inspectit.ui.rcp.ci.view.businessContextManager";
/**
* List of {@link ApplicationLeaf}s to show.
*/
private List<ApplicationLeaf> applications;
/**
* Default constructor.
*
* @param workbenchPartSite
* The {@link IWorkbenchPartSite} the view is showed in.
*/
BusinessContextManagerView(IWorkbenchPartSite workbenchPartSite) {
super(workbenchPartSite);
InspectIT.getDefault().getInspectITConfigurationInterfaceManager().addApplicationDefinitionChangeListener(this);
}
/**
* {@inheritDoc}
*/
@Override
public void applicationCreated(ApplicationDefinition application, int positionIndex, CmrRepositoryDefinition repositoryDefinition) {
ApplicationLeaf leaf = new ApplicationLeaf(application, getApplications(), repositoryDefinition);
getApplications().add(positionIndex, leaf);
StructuredSelection selection = new StructuredSelection(leaf);
performUpdate(true, selection);
}
/**
* {@inheritDoc}
*/
@Override
public void applicationMoved(ApplicationDefinition application, int oldPositionIndex, int newPositionIndex, CmrRepositoryDefinition repositoryDefinition) {
ApplicationLeaf leaf = new ApplicationLeaf(application, getApplications(), repositoryDefinition);
getApplications().remove(oldPositionIndex);
getApplications().add(newPositionIndex, leaf);
StructuredSelection selection = new StructuredSelection(leaf);
performUpdate(false, selection);
}
/**
* {@inheritDoc}
*/
@Override
public void applicationUpdated(ApplicationDefinition application, CmrRepositoryDefinition repositoryDefinition) {
ApplicationLeaf leaf = new ApplicationLeaf(application, getApplications(), repositoryDefinition);
getApplications().set(leaf.getIndexInParentList(), leaf);
performUpdate(false, null);
}
/**
* {@inheritDoc}
*/
@Override
public void applicationDeleted(ApplicationDefinition application, CmrRepositoryDefinition repositoryDefinition) {
int index = 0;
for (ApplicationLeaf appLeaf : getApplications()) {
if (appLeaf.getApplication().getId() == application.getId()) {
break;
}
index++;
}
if (index < getApplications().size()) {
getApplications().remove(index);
}
performUpdate(false);
}
/**
* {@inheritDoc}
*/
@Override
public void dispose() {
InspectIT.getDefault().getInspectITConfigurationInterfaceManager().removeApplicationDefinitionChangeListener(this);
super.dispose();
}
/**
* {@inheritDoc}
*/
@Override
protected IBaseLabelProvider getLabelProvider() {
return new ApplicationLabelProvider();
}
/**
* {@inheritDoc}
*/
@Override
protected String getMenuId() {
return MENU_ID;
}
/**
* {@inheritDoc}
*/
@Override
protected void updateContent() {
getApplications().clear();
if ((null != displayedCmrRepositoryDefinition) && (displayedCmrRepositoryDefinition.getOnlineStatus() == OnlineStatus.ONLINE)) {
List<ApplicationDefinition> applicationDefinitions = displayedCmrRepositoryDefinition.getConfigurationInterfaceService().getApplicationDefinitions();
for (ApplicationDefinition appDef : applicationDefinitions) {
getApplications().add(new ApplicationLeaf(appDef, getApplications(), displayedCmrRepositoryDefinition));
}
}
}
/**
* {@inheritDoc}
*/
@Override
protected IDoubleClickListener getDoubleClickListener() {
return new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
ISelection selection = event.getSelection();
if (!selection.isEmpty()) {
Object selected = ((StructuredSelection) selection).getFirstElement();
if (selected instanceof IApplicationProvider) {
new OpenApplicationDefinitionJob(displayedCmrRepositoryDefinition, ((IApplicationProvider) selected).getApplication().getId(), getWorkbenchSite().getPage()).schedule();
}
}
}
};
}
/**
* {@inheritDoc}
*/
@Override
protected boolean matchesContentType(Object object) {
return object instanceof ApplicationLeaf;
}
/**
* {@inheritDoc}
*/
@Override
protected List<?> getTableInput() {
return getApplications();
}
/**
* {@inheritDoc}
*/
@Override
protected void createTableColumns(TableViewer tableViewer) {
TableViewerColumn viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Application");
viewerColumn.getColumn().setWidth(150);
viewerColumn.getColumn().setToolTipText("Application name.");
viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Business Transactions");
viewerColumn.getColumn().setWidth(150);
viewerColumn.getColumn().setToolTipText("Number of business transactions in the application.");
viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Description");
viewerColumn.getColumn().setWidth(200);
viewerColumn.getColumn().setToolTipText("Description.");
}
/**
* {@inheritDoc}
*/
@Override
protected void createHeadClient(Form form) {
Composite infoComposite = new Composite(form.getHead(), SWT.NONE);
infoComposite.setLayout(new GridLayout(2, false));
Label infoLabel = new Label(infoComposite, SWT.NONE);
infoLabel.setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_INFORMATION));
infoLabel.setToolTipText(BusinessContextManagerViewPart.APP_ORDER_INFO_TOOLTIP);
Label infoLabelText = new Label(infoComposite, SWT.NONE);
infoLabelText.setText("Pay attention to the order of application definitions!");
infoLabelText.setToolTipText(BusinessContextManagerViewPart.APP_ORDER_INFO_TOOLTIP);
form.setHeadClient(infoComposite);
}
/**
* Gets {@link #applications}.
*
* @return {@link #applications}
*/
private List<ApplicationLeaf> getApplications() {
if (null == applications) {
applications = new ArrayList<>();
}
return applications;
}
}
}