blob: 075c172faee802b0b499b0496a0696ceb56ed050 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Red Hat Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andrew Ferrazzutti <aferrazz@redhat.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.systemtap.ui.ide.handlers;
import java.util.ArrayList;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.IVerticalRulerInfo;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.IDEPlugin;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.IDESessionSettings;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.editors.stp.STPEditor;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.preferences.IDEPreferenceConstants;
import org.eclipse.linuxtools.systemtap.graphing.ui.widgets.ExceptionErrorDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
public class AddStapProbeHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ITextEditor editor;
try {
editor = (ITextEditor) HandlerUtil.getActiveEditor(event);
} catch (ClassCastException e) {
ExceptionErrorDialog.openError(
Messages.AddStapProbe_unableToInsertProbe,
Messages.AddStapProbe_editorError, e);
throw new ExecutionException(Messages.AddStapProbe_editorError, e);
}
IVerticalRulerInfo rulerInfo = editor.getAdapter(IVerticalRulerInfo.class);
Shell shell = editor.getSite().getShell();
shell.setCursor(shell.getDisplay().getSystemCursor(
SWT.CURSOR_WAIT));
int lineno = rulerInfo.getLineOfLastMouseButtonActivity();
IDocument document = editor.getDocumentProvider().getDocument(
editor.getEditorInput());
String s = document.get();
String[] lines = s.split("\n"); //$NON-NLS-1$
String line = lines[lineno].trim();
boolean die = false;
if (line.isEmpty()) {//eat blank lines
die = true;
}
if (line.startsWith("#")) {//eat preprocessor directives //$NON-NLS-1$
die = true;
}
if (line.startsWith("//")) {//eat C99 comments //$NON-NLS-1$
die = true;
}
if (line.startsWith("/*") && !line.contains("*/") && !line.endsWith("*/")) {//try to eat single-line C comments //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
die = true;
}
// gogo find comment segments
try {
ArrayList<Integer> commentChunks = new ArrayList<>();
char[] chars = s.toCharArray();
int needle = 1;
int offset = document.getLineOffset(lineno);
while (needle < chars.length) {
if (chars[needle - 1] == '/' && chars[needle] == '*') {
commentChunks.add(needle);
while (needle < chars.length) {
if (chars[needle - 1] == '*'
&& chars[needle] == '/') {
commentChunks.add(needle);
needle++;
break;
}
needle++;
}
}
needle++;
}
for (int i = 0, pair, start, end; i < commentChunks.size(); i++) {
if (!(commentChunks.get(i).intValue() < offset)) {
pair = i - i % 2;
start = commentChunks.get(pair).intValue();
end = commentChunks.get(pair + 1).intValue();
if (offset >= start && offset <= end) {
die = true;
}
}
}
} catch (BadLocationException excp) {
ExceptionErrorDialog.openError(Messages.AddStapProbe_unableToInsertProbe, excp);
return null;
}
if (die) {
MessageDialog.openError(
PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getShell(),
Messages.CEditor_probeInsertFailed, Messages.CEditor_canNotProbeLine);
} else {
IEditorInput in = editor.getEditorInput();
if (in instanceof FileStoreEditorInput) {
FileStoreEditorInput input = (FileStoreEditorInput) in;
IPreferenceStore p = IDEPlugin.getDefault()
.getPreferenceStore();
String kernroot = p
.getString(IDEPreferenceConstants.P_KERNEL_SOURCE);
String filepath = input.getURI().getPath();
String kernrelative = filepath.substring(
kernroot.length() + 1, filepath.length());
StringBuffer sb = new StringBuffer();
sb.append("probe kernel.statement(\"*@" + kernrelative + ":" + (lineno + 1) + "\")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
sb.append("\n{\n\t\n}\n"); //$NON-NLS-1$
STPEditor activeSTPEditor = IDESessionSettings.getOrAskForActiveSTPEditor(false);
if (activeSTPEditor != null) {
activeSTPEditor.insertText(sb.toString());
}
}
}
shell.setCursor(null); // Return the cursor to normal
return null;
}
}