package rocks.inspectit.ui.rcp.ci.view;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
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.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
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.Environment;
import rocks.inspectit.shared.cs.ci.Profile;
import rocks.inspectit.ui.rcp.InspectIT;
import rocks.inspectit.ui.rcp.ci.job.OpenEnvironmentJob;
import rocks.inspectit.ui.rcp.ci.job.OpenProfileJob;
import rocks.inspectit.ui.rcp.ci.listener.IEnvironmentChangeListener;
import rocks.inspectit.ui.rcp.ci.listener.IProfileChangeListener;
import rocks.inspectit.ui.rcp.model.ci.EnvironmentLeaf;
import rocks.inspectit.ui.rcp.model.ci.ProfileLeaf;
import rocks.inspectit.ui.rcp.provider.IEnvironmentProvider;
import rocks.inspectit.ui.rcp.provider.IProfileProvider;
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 Profile}s and {@link Environment}s.
*
* @author Ivan Senic, Alexander Wert
*
*/
public class InstrumentationManagerViewPart extends ViewPart implements IRefreshableView {
/**
* View id.
*/
public static final String VIEW_ID = "rocks.inspectit.ui.rcp.ci.view.instrumentationManager";
/**
* View instance.
*/
private AbstractTableBasedManagerView managerView;
/**
* {@inheritDoc}
*/
@Override
public void createPartControl(Composite parent) {
managerView = new InstrumentationManagerView(getSite());
managerView.createControls(parent, false);
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();
}
/**
* View displaying {@link Profile}s and {@link Environment}s.
*
* @author Ivan Senic, Alexander Wert
*
*/
private static class InstrumentationManagerView extends AbstractTableBasedManagerView implements IProfileChangeListener, IEnvironmentChangeListener {
/**
* Menu to be bounded.
*/
private static final String MENU_ID = "rocks.inspectit.ui.rcp.ci.view.instrumentationManager.table";
/**
* Input list of profiles.
*/
private List<IProfileProvider> profileLeafs = new ArrayList<>(0);
/**
* Input list of environments.
*/
private List<IEnvironmentProvider> environmentLeafs = new ArrayList<>(0);
/**
* Button for environment selection.
*/
private Button environmentSelection;
/**
* Button for profile selection.
*/
private Button profileSelection;
/**
* Default constructor.
*
* @param workbenchPartSite
* The {@link IWorkbenchPartSite} the view is showed in.
*/
InstrumentationManagerView(IWorkbenchPartSite workbenchPartSite) {
super(workbenchPartSite);
InspectIT.getDefault().getInspectITConfigurationInterfaceManager().addProfileChangeListener(this);
InspectIT.getDefault().getInspectITConfigurationInterfaceManager().addEnvironmentChangeListener(this);
}
/**
* {@inheritDoc}
*/
@Override
public void createControls(Composite parent, boolean multiSelection) {
super.createControls(parent, multiSelection);
}
/**
* {@inheritDoc}
*/
@Override
protected void createHeadClient(Form form) {
Composite headClient = new Composite(form.getHead(), SWT.NONE);
GridLayout gl = new GridLayout(3, false);
gl.marginHeight = 0;
gl.marginWidth = 0;
headClient.setLayout(gl);
new Label(headClient, SWT.NONE).setText("Show:");
environmentSelection = new Button(headClient, SWT.RADIO);
environmentSelection.setText("Environments");
environmentSelection.setSelection(true);
profileSelection = new Button(headClient, SWT.RADIO);
profileSelection.setText("Profiles");
SelectionAdapter listener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (null != displayedCmrRepositoryDefinition) {
selectionProviderAdapter.setSelection(new StructuredSelection(displayedCmrRepositoryDefinition));
}
performUpdate(false);
}
};
environmentSelection.addSelectionListener(listener);
profileSelection.addSelectionListener(listener);
form.setHeadClient(headClient);
}
/**
* {@inheritDoc}
*/
@Override
protected void createTableColumns(TableViewer tableViewer) {
if (isShowEnvironments()) {
// columns when environments are displayed
TableViewerColumn viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Environment");
viewerColumn.getColumn().setWidth(150);
viewerColumn.getColumn().setToolTipText("Environment name.");
viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Updated");
viewerColumn.getColumn().setWidth(80);
viewerColumn.getColumn().setToolTipText("The date and time when the environment was last time updated.");
viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Profiles");
viewerColumn.getColumn().setWidth(60);
viewerColumn.getColumn().setToolTipText("Number of linked profiles in the Environment.");
viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Description");
viewerColumn.getColumn().setWidth(150);
viewerColumn.getColumn().setToolTipText("Environment description.");
} else if (isShowProfiles()) {
// columns when profiles are displayed
TableViewerColumn viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Profile");
viewerColumn.getColumn().setWidth(150);
viewerColumn.getColumn().setToolTipText("Profile name.");
viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Updated");
viewerColumn.getColumn().setWidth(80);
viewerColumn.getColumn().setToolTipText("The date and time when the profile was last time updated.");
viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Active");
viewerColumn.getColumn().setWidth(40);
viewerColumn.getColumn()
.setToolTipText("If profile is active or not, note that deactivated profile will not be considered during the instrumentation even if it's a part of an Environment.");
viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Default");
viewerColumn.getColumn().setWidth(40);
viewerColumn.getColumn().setToolTipText("If profile is default or not, note that default profile will be added to any new created Environment.");
TableViewerColumn typeColumn = new TableViewerColumn(tableViewer, SWT.NONE);
typeColumn.getColumn().setMoveable(true);
typeColumn.getColumn().setResizable(true);
typeColumn.getColumn().setText("Type");
typeColumn.getColumn().setWidth(40);
typeColumn.getColumn().setToolTipText("Type of data profile is holding.");
viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
viewerColumn.getColumn().setMoveable(true);
viewerColumn.getColumn().setResizable(true);
viewerColumn.getColumn().setText("Description");
viewerColumn.getColumn().setWidth(250);
viewerColumn.getColumn().setToolTipText("Profile description.");
}
tableViewer.setLabelProvider(getLabelProvider());
ViewerComparator comparator = getViewerComparator();
if (null != comparator) {
tableViewer.setComparator(getViewerComparator());
}
}
/**
* {@inheritDoc}
*/
@Override
protected IBaseLabelProvider getLabelProvider() {
if (isShowEnvironments()) {
return new EnvironmentLabelProvider();
} else if (isShowProfiles()) {
return new ProfileLabelProvider();
}
return null;
}
/**
* {@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 IProfileProvider) {
// open profile job
IProfileProvider profileProvider = (IProfileProvider) selected;
new OpenProfileJob(profileProvider.getCmrRepositoryDefinition(), profileProvider.getProfile().getId(), getWorkbenchSite().getPage()).schedule();
} else if (selected instanceof IEnvironmentProvider) {
IEnvironmentProvider environmentProvider = (IEnvironmentProvider) selected;
new OpenEnvironmentJob(environmentProvider.getCmrRepositoryDefinition(), environmentProvider.getEnvironment().getId(), getWorkbenchSite().getPage()).schedule();
}
}
}
};
}
/**
* {@inheritDoc}
*/
@Override
public void profileCreated(Profile profile, CmrRepositoryDefinition repositoryDefinition) {
if (!Objects.equals(repositoryDefinition, displayedCmrRepositoryDefinition)) {
return;
}
ProfileLeaf profileLeaf = new ProfileLeaf(profile, repositoryDefinition);
profileLeafs.add(profileLeaf);
showProfiles(false);
}
/**
* {@inheritDoc}
*/
@Override
public void profileUpdated(Profile profile, CmrRepositoryDefinition repositoryDefinition, boolean onlyProperties) {
if (!Objects.equals(repositoryDefinition, displayedCmrRepositoryDefinition)) {
return;
}
for (Iterator<IProfileProvider> it = profileLeafs.iterator(); it.hasNext();) {
IProfileProvider provider = it.next();
if (Objects.equals(profile.getId(), provider.getProfile().getId())) {
it.remove();
profileLeafs.add(new ProfileLeaf(profile, provider.getCmrRepositoryDefinition()));
performUpdate(false);
break;
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void profileDeleted(Profile profile, CmrRepositoryDefinition repositoryDefinition) {
if (!Objects.equals(repositoryDefinition, displayedCmrRepositoryDefinition)) {
return;
}
for (Iterator<IProfileProvider> it = profileLeafs.iterator(); it.hasNext();) {
IProfileProvider provider = it.next();
if (Objects.equals(profile.getId(), provider.getProfile().getId())) {
it.remove();
performUpdate(false);
break;
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void environmentCreated(Environment environment, CmrRepositoryDefinition repositoryDefinition) {
if (!Objects.equals(repositoryDefinition, displayedCmrRepositoryDefinition)) {
return;
}
EnvironmentLeaf environmentLeaf = new EnvironmentLeaf(environment, repositoryDefinition);
environmentLeafs.add(environmentLeaf);
showEnvironments(false);
}
/**
* {@inheritDoc}
*/
@Override
public void environmentUpdated(Environment environment, CmrRepositoryDefinition repositoryDefinition) {
if (!Objects.equals(repositoryDefinition, displayedCmrRepositoryDefinition)) {
return;
}
for (Iterator<IEnvironmentProvider> it = environmentLeafs.iterator(); it.hasNext();) {
IEnvironmentProvider provider = it.next();
if (Objects.equals(environment.getId(), provider.getEnvironment().getId())) {
it.remove();
environmentLeafs.add(new EnvironmentLeaf(environment, repositoryDefinition));
performUpdate(false);
break;
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void environmentDeleted(Environment environment, CmrRepositoryDefinition repositoryDefinition) {
if (!Objects.equals(repositoryDefinition, displayedCmrRepositoryDefinition)) {
return;
}
for (Iterator<IEnvironmentProvider> it = environmentLeafs.iterator(); it.hasNext();) {
IEnvironmentProvider provider = it.next();
if (Objects.equals(environment.getId(), provider.getEnvironment().getId())) {
it.remove();
performUpdate(false);
break;
}
}
}
/**
* @return Are environments displayed.
*/
private boolean isShowEnvironments() {
return environmentSelection.getSelection();
}
/**
* @return Are profiles displayed.
*/
private boolean isShowProfiles() {
return profileSelection.getSelection();
}
/**
* Makes the view show the environments.
*
* @param update
* If update of the input should be made.
*/
public void showEnvironments(boolean update) {
if (!isShowEnvironments()) {
environmentSelection.setSelection(true);
profileSelection.setSelection(false);
}
performUpdate(update);
}
/**
* Makes the view show the profiles.
*
* @param update
* If update of the input should be made.
*/
public void showProfiles(boolean update) {
if (!isShowProfiles()) {
profileSelection.setSelection(true);
environmentSelection.setSelection(false);
}
performUpdate(update);
}
/**
* {@inheritDoc}
*/
@Override
protected String getMenuId() {
return MENU_ID;
};
/**
* {@inheritDoc}
*/
@Override
public void dispose() {
InspectIT.getDefault().getInspectITConfigurationInterfaceManager().removeProfileChangeListener(this);
InspectIT.getDefault().getInspectITConfigurationInterfaceManager().removeEnvironmentChangeListener(this);
super.dispose();
}
/**
* {@inheritDoc}
*/
@Override
protected boolean matchesContentType(Object object) {
return (object instanceof IProfileProvider) || (object instanceof IEnvironmentProvider);
}
/**
* {@inheritDoc}
*/
@Override
protected void updateContent() {
// reset lists
profileLeafs = new ArrayList<>();
environmentLeafs = new ArrayList<>();
if ((null != displayedCmrRepositoryDefinition) && (displayedCmrRepositoryDefinition.getOnlineStatus() == OnlineStatus.ONLINE)) {
// profiles
List<Profile> profiles = displayedCmrRepositoryDefinition.getConfigurationInterfaceService().getAllProfiles();
for (Profile profile : profiles) {
profileLeafs.add(new ProfileLeaf(profile, displayedCmrRepositoryDefinition));
}
// environment
Collection<Environment> environments = displayedCmrRepositoryDefinition.getConfigurationInterfaceService().getAllEnvironments();
for (Environment environment : environments) {
environmentLeafs.add(new EnvironmentLeaf(environment, displayedCmrRepositoryDefinition));
}
}
}
/**
* {@inheritDoc}
*/
@Override
protected List<?> getTableInput() {
if (isShowEnvironments()) {
return environmentLeafs;
} else if (isShowProfiles()) {
return profileLeafs;
}
return null;
}
}
}