Skip to content

Commit

Permalink
7366: Agent Plugin Object Contributions to Methods
Browse files Browse the repository at this point in the history
Reviewed-by: hirt, aptmac
  • Loading branch information
Joshua Matsuoka committed Jul 30, 2021
1 parent 70901a3 commit ef023e3
Show file tree
Hide file tree
Showing 6 changed files with 308 additions and 0 deletions.
39 changes: 39 additions & 0 deletions application/org.openjdk.jmc.console.agent/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,43 @@
</command>
</menuContribution>
</extension>
<extension
name="Menu contribution for create probe"
point="org.eclipse.ui.menus">
<menuContribution
locationURI="popup:org.eclipse.ui.popup.any?after=group.top">
<command
commandId="org.openjdk.jmc.console.agent.contribution.CreateMethodProbeHandler"
label="Create Method Probe"
defaultHandler="org.openjdk.jmc.console.agent.contribution.CreateMethodProbeHandler">
<visibleWhen>
<with variable="activeMenuSelection">
<iterate>
<or>
<adapt type="org.openjdk.jmc.common.IMCFrame" />
<adapt type="org.openjdk.jmc.common.IMCMethod" />
</or>
</iterate>
<count value="1" />
</with>
</visibleWhen>
</command>
</menuContribution>
</extension>
<extension
name="Commands for creating Probe"
point="org.eclipse.ui.commands">
<command
defaultHandler="org.openjdk.jmc.console.agent.contribution.CreateMethodProbeHandler"
id="org.openjdk.jmc.console.agent.CreateMethodProbeHandler"
name="Create Method Probe">
</command>
</extension>
<extension
point="org.eclipse.ui.handlers">
<handler
class="org.openjdk.jmc.console.agent.contribution.CreateMethodProbeHandler"
commandId="org.openjdk.jmc.console.agent.contribution.CreateMethodProbeHandler">
</handler>
</extension>
</plugin>
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, Red Hat Inc. All rights reserved.
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The contents of this file are subject to the terms of either the Universal Permissive License
* v 1.0 as shown at http://oss.oracle.com/licenses/upl
*
* or the following license:
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions
* and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other materials provided with
* the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.openjdk.jmc.console.agent.contribution;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.widgets.Shell;
import org.openjdk.jmc.console.agent.manager.model.IPreset;
import org.openjdk.jmc.ui.wizards.OnePageWizardDialog;

public class CreateMethodProbeDialog extends OnePageWizardDialog {

public CreateMethodProbeDialog(Shell parent, IWizardPage page) {
super(parent, page);
}

public static Dialog create(Shell parent, IPreset preset) {
CreateMethodProbeDialog page = new CreateMethodProbeDialog(parent, new CreateMethodProbePage(preset));
return page;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, Red Hat Inc. All rights reserved.
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The contents of this file are subject to the terms of either the Universal Permissive License
* v 1.0 as shown at http://oss.oracle.com/licenses/upl
*
* or the following license:
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions
* and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other materials provided with
* the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.openjdk.jmc.console.agent.contribution;

import java.io.IOException;
import java.util.logging.Logger;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.openjdk.jmc.common.IMCMethod;
import org.openjdk.jmc.console.agent.manager.model.IEvent;
import org.openjdk.jmc.console.agent.manager.model.IEvent.Location;
import org.openjdk.jmc.console.agent.manager.model.IPreset;
import org.openjdk.jmc.console.agent.manager.model.PresetRepository;
import org.openjdk.jmc.console.agent.manager.model.PresetRepositoryFactory;
import org.openjdk.jmc.flightrecorder.stacktrace.StacktraceFrame;
import org.openjdk.jmc.ui.common.util.AdapterUtil;
import org.openjdk.jmc.ui.idesupport.ObjectContributionMenuSelectionListener;

public class CreateMethodProbeHandler extends ObjectContributionMenuSelectionListener {

private static Logger logger = Logger.getLogger(CreateMethodProbeHandler.class.getName());

@Override
public void execute(ISelection selection) {
if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
if (structuredSelection.getFirstElement() instanceof IMCMethod) {
IMCMethod method = AdapterUtil.getAdapter(((IStructuredSelection) selection).getFirstElement(),
IMCMethod.class);
createMethodProbe(method);
} else if (structuredSelection.getFirstElement() instanceof StacktraceFrame) {
StacktraceFrame frame = (StacktraceFrame) structuredSelection.getFirstElement();
createMethodProbe(frame.getFrame().getMethod());
}
}
}

private void createMethodProbe(IMCMethod method) {
PresetRepository repository = PresetRepositoryFactory.createSingleton();
IPreset preset = repository.createPreset();
IEvent event = preset.createEvent();
preset.setFileName(method.getMethodName() + ".xml"); //$NON-NLS-1$
event.setMethodName(method.getMethodName());
event.setMethodDescriptor(method.getFormalDescriptor());
event.setClazz(method.getType().getFullName());
event.setLocation(Location.WRAP);
preset.addEvent(event);
openUserDialog(preset);
preset.save();
try {
repository.addPreset(preset);
} catch (IOException e) {
logger.severe(e.toString());
}
}

private void openUserDialog(IPreset preset) {
Shell shell = Display.getCurrent().getActiveShell();
Dialog dialog = CreateMethodProbeDialog.create(shell, preset);
dialog.setBlockOnOpen(true);
dialog.open();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, Red Hat Inc. All rights reserved.
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The contents of this file are subject to the terms of either the Universal Permissive License
* v 1.0 as shown at http://oss.oracle.com/licenses/upl
*
* or the following license:
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions
* and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other materials provided with
* the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package org.openjdk.jmc.console.agent.contribution;

import org.openjdk.jmc.console.agent.wizards.BaseWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.openjdk.jmc.console.agent.manager.model.IPreset;
import org.openjdk.jmc.console.agent.messages.internal.Messages;

public class CreateMethodProbePage extends BaseWizardPage {

private Text presetName;
private IPreset preset;

public CreateMethodProbePage(IPreset preset) {
super(Messages.ProbeCreationPage_MESSAGE_PROBE_CREATION_PAGE_TITLE);
this.preset = preset;
}

@Override
public void createControl(Composite parent) {
initializeDialogUnits(parent);

setTitle(Messages.ProbeCreationPage_MESSAGE_PROBE_CREATION_PAGE_TITLE);
setDescription(Messages.ProbeCreationPage_MESSAGE_PROBE_CREATION_PAGE_DESCRIPTION);

ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
Composite container = new Composite(sc, SWT.NONE);
sc.setContent(container);

GridLayout layout = new GridLayout();
container.setLayout(layout);

createFileNameContainer(container).setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

populateUI();
bindListeners();

sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
sc.setMinSize(container.computeSize(SWT.DEFAULT, SWT.DEFAULT));
setControl(sc);
}

private Composite createFileNameContainer(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
int cols = 5;
GridLayout layout = new GridLayout(cols, false);
layout.horizontalSpacing = 8;
container.setLayout(layout);

presetName = createTextInput(container, cols,
Messages.ProbeCreationPage_MESSAGE_PROBE_CREATION_SET_NAME_MESSAGE,
Messages.ProbeCreationPage_MESSAGE_PROBE_CREATION_SET_NAME_DESCRIPTION);

return container;
}

private void bindListeners() {
presetName.addModifyListener(
handleExceptionIfAny((ModifyListener) e -> preset.setFileName(presetName.getText())));
}

private void populateUI() {
presetName.setText(preset.getFileName());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,10 @@ public class Messages extends NLS {
public static String PresetManagerPage_MESSAGE_IMPORT_EXTERNAL_PRESET_FILES;
public static String PresetManagerPage_MESSAGE_EXPORT_PRESET_TO_A_FILE;
public static String PresetManagerPage_MESSAGE_EVENTS;
public static String ProbeCreationPage_MESSAGE_PROBE_CREATION_PAGE_TITLE;
public static String ProbeCreationPage_MESSAGE_PROBE_CREATION_PAGE_DESCRIPTION;
public static String ProbeCreationPage_MESSAGE_PROBE_CREATION_SET_NAME_MESSAGE;
public static String ProbeCreationPage_MESSAGE_PROBE_CREATION_SET_NAME_DESCRIPTION;
public static String EditorTab_TITLE;
public static String ActionButtons_LABEL_SAVE_TO_PRESET_BUTTON;
public static String ActionButtons_LABEL_SAVE_TO_FILE_BUTTON;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,11 @@ PresetEditingWizardPreviewPage_PAGE_NAME=Agent Preset Editing
PresetEditingWizardPreviewPage_MESSAGE_PRESET_EDITING_WIZARD_PREVIEW_PAGE_TITLE=Preview Preset Output
PresetEditingWizardPreviewPage_MESSAGE_PRESET_EDITING_WIZARD_PREVIEW_PAGE_DESCRIPTION=Inspect the generated XML before it is saved. Click Back to make any modifications if needed. Click Finish to save.

ProbeCreationPage_MESSAGE_PROBE_CREATION_SET_NAME_MESSAGE=Preset Name
ProbeCreationPage_MESSAGE_PROBE_CREATION_PAGE_TITLE=Create Method Probe
ProbeCreationPage_MESSAGE_PROBE_CREATION_PAGE_DESCRIPTION=Provide a name for the generated probe preset.
ProbeCreationPage_MESSAGE_PROBE_CREATION_SET_NAME_DESCRIPTION=Name for the Generated Preset

EditorTab_TITLE=Editor

ActionButtons_LABEL_SAVE_TO_PRESET_BUTTON=Save to Preset
Expand Down

0 comments on commit ef023e3

Please sign in to comment.