/******************************************************************************* * Copyright (c) 2004, 2016 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: * Kent Sebastian <ksebasti@redhat.com> - initial API and implementation * Keith Seitz <keiths@redhat.com> - much of the code in the LogReader class *******************************************************************************/ package org.eclipse.linuxtools.internal.oprofile.ui.view; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.linuxtools.internal.oprofile.core.Oprofile; import org.eclipse.linuxtools.internal.oprofile.ui.OprofileUiMessages; import org.eclipse.linuxtools.profiling.launch.IRemoteFileProxy; import org.eclipse.linuxtools.profiling.launch.RemoteProxyManager; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; /** * Log reader action. Reads /var/lib/oprofile/samples/oprofiled.log and displays * it in a nice dialog. Although the log is of dubious utility, it might be useful * to some. */ public class OprofileViewLogReaderAction extends Action { public OprofileViewLogReaderAction() { super(OprofileUiMessages.getString("view.actions.logreader.label")); //$NON-NLS-1$ } @Override public void run() { Shell activeShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); LogReader log = new LogReader(); try { new ProgressMonitorDialog(activeShell).run(true, false, log); } catch (InvocationTargetException|InterruptedException e) { e.printStackTrace(); } //open custom log dialog OprofiledLogDialog odlg = new OprofiledLogDialog(activeShell, log.getLogContents()); odlg.open(); } } /** * A Runnable to read oprofiled's logfile */ class LogReader implements Runnable, IRunnableWithProgress { private static long lastModified = -1; private static String contents = null; @Override public void run() { try { IRemoteFileProxy proxy = RemoteProxyManager.getInstance().getFileProxy( Oprofile.OprofileProject.getProject()); IFileStore fileStore = proxy.getResource(Oprofile.getLogFile()); if (fileStore.fetchInfo().exists()) { long modified = fileStore.fetchInfo().getLastModified(); // only reread it if it has been modified since the last run if (modified != lastModified) { lastModified = modified; contents = ""; //$NON-NLS-1$ } try (InputStream is = fileStore.openInputStream(EFS.NONE, new NullProgressMonitor()); BufferedReader bi = new BufferedReader( new InputStreamReader(is))) { String line; while ((line = bi.readLine()) != null) { contents += line + "\n"; //$NON-NLS-1$ } bi.close(); } } } catch (FileNotFoundException e) { // The file doesn't exist or was erased. Try again next time. contents = OprofileUiMessages .getString("oprofiled.logreader.error.fileNotFound"); //$NON-NLS-1$ } catch (IOException e) { // Error reading log. Try again next time. lastModified = 0; contents = OprofileUiMessages .getString("oprofiled.logreader.error.io"); //$NON-NLS-1$ } catch (CoreException e) { e.printStackTrace(); } } public String getLogContents() { return contents; } @Override public void run(IProgressMonitor monitor) { this.run(); } } /** * A custom dialog box to display the oprofiled log file. */ class OprofiledLogDialog extends MessageDialog { //string to contain the log file private String textContent = null; public static final int GRID_WIDTH = 350; public static final int GRID_HEIGHT = 400; public OprofiledLogDialog (Shell parentShell, String dialogMessage) { super(parentShell, OprofileUiMessages.getString("oprofiled.logreader.dialog.title"), null, null, MessageDialog.NONE, new String[] { IDialogConstants.OK_LABEL }, 0); //$NON-NLS-1$ textContent = dialogMessage; } @Override protected Control createCustomArea(Composite parent) { Composite area = new Composite(parent, 0); Layout layout = new GridLayout(1, true); GridData gd = new GridData(GRID_WIDTH, GRID_HEIGHT); area.setLayout(layout); area.setLayoutData(gd); Text txt = new Text(area, SWT.READ_ONLY | SWT.MULTI | SWT.V_SCROLL | SWT.BORDER); //Check if the textContent isn't null if (textContent != null){ txt.setText(textContent); } txt.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); return area; } }