sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi.wizards/src/com/nokia/carbide/cpp/internal/pi/wizards/ui/TraceHandler.java
author Toni Pulkkinen <ext-toni.p.pulkkinen@nokia.com>
Wed, 23 Jun 2010 15:05:09 +0300
changeset 12 ae255c9aa552
permissions -rw-r--r--
Performance Investigator Carbide extension 2.4.0

/*
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description: 
 *
 */

package com.nokia.carbide.cpp.internal.pi.wizards.ui;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.swt.widgets.Display;

import com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace;
import com.nokia.carbide.cpp.pi.PiPlugin;
import com.nokia.carbide.cpp.pi.export.ITraceClientNotificationsIf;
import com.nokia.carbide.cpp.pi.wizards.WizardsPlugin;

/**
 * Helper class to handle traces
 */
public class TraceHandler implements ITraceClientNotificationsIf {

	private NewPIWizardPage wizardPage;
	private IWizardContainer wizardContainer;
	private ProfilerActivatorGroup profilerActivatorGroup;

	/**
	 * Constructor
	 * 
	 * @param profilerActivatorGroup
	 *            instance of the ProfilerActivatorGroup
	 */
	public TraceHandler(ProfilerActivatorGroup profilerActivatorGroup) {
		this.profilerActivatorGroup = profilerActivatorGroup;
		this.wizardPage = profilerActivatorGroup.getWizardPage();
		this.wizardContainer = profilerActivatorGroup.getWizardContainer();

	}

	/**
	 * Update current connection
	 * 
	 */
	public void updateCurrenConnection() {
		try {
			IRunnableWithProgress runnableWithProgress = new IRunnableWithProgress() {
				public void run(IProgressMonitor monitor)
						throws InvocationTargetException, InterruptedException {
					monitor.beginTask(Messages.getString("TraceHandler.resolvingCurrentConnection"), //$NON-NLS-1$
							IProgressMonitor.UNKNOWN);
					try {
						String currenConnection = PiPlugin.getTraceProvider()
								.getDisplayNameForCurrentConnection(monitor);
						profilerActivatorGroup
								.setCurrentConnection(currenConnection);
					} catch (CoreException e) {
						throw new InvocationTargetException(e);
					} finally {
						monitor.done();
					}
				}
			};
			wizardContainer.run(true, true, runnableWithProgress);
		} catch (InvocationTargetException e) {
			if(e.getCause() instanceof CoreException){
				updateStatus(((CoreException)e.getCause()).getStatus());
			}else{
				notifyError(e.getMessage());
			}
		} catch (InterruptedException e) {
			notifyError(e.getMessage());
		}
	}

	/**
	 * Fetch available plug-ins list
	 * 
	 */
	public List<ITrace> fetchAvailablePlugins() {
		final List<ITrace> plugins = new ArrayList<ITrace>();
		try {		
			IRunnableWithProgress runnableWithProgress = new IRunnableWithProgress() {
				public void run(IProgressMonitor monitor)
						throws InvocationTargetException, InterruptedException{
					monitor.beginTask(Messages.getString("TraceHandler.fetchingPluginsList"), //$NON-NLS-1$
							IProgressMonitor.UNKNOWN);
					try {				
						plugins.addAll(PiPlugin.getTraceProvider()
								.getAvailableSamplers(TraceHandler.this, monitor));				
					} catch (CoreException e) {
						throw new InvocationTargetException(e);					
					} finally {
						monitor.done();
					}

				}
			};
			wizardContainer.run(true, false, runnableWithProgress);		
			if(wizardPage instanceof INewPIWizardSettings){
				((INewPIWizardSettings)wizardPage).validatePage();
			}
			
			return plugins;
		}catch (InvocationTargetException e) {
			if(e.getCause() instanceof CoreException){
				updateStatus(((CoreException)e.getCause()).getStatus());
			}else{
				notifyError(e.getMessage());	
			}			
		} catch (InterruptedException e) {
			notifyError(e.getMessage());
		}
		return null;
	}

	/**
	 * Start trace
	 * 
	 * @param fileName
	 *            for new profiler data file
	 * @param traceIDs
	 *            selected plug-ins to be profiling
	 */
	public void startTrace(final String fileName, final int[] traceIDs) {

		try {
			IRunnableWithProgress runnableWithProgress = new IRunnableWithProgress() {
				public void run(IProgressMonitor monitor)
						throws InvocationTargetException, InterruptedException {
					monitor.beginTask(Messages.getString("TraceHandler.preparingTracing"), //$NON-NLS-1$
							IProgressMonitor.UNKNOWN);			
					try {	
						
						PiPlugin.getTraceProvider().startTrace(
								fileName,
								traceIDs,
								TraceHandler.this,
								new SubProgressMonitor(monitor,
										IProgressMonitor.UNKNOWN));						
					} catch (CoreException e) {
						throw new InvocationTargetException(e);
					} finally {
						monitor.done();
					}

				}
			};
			wizardContainer.run(true, false, runnableWithProgress);

		} catch (InvocationTargetException e) {
			if(e.getCause() instanceof CoreException){
				updateStatus(((CoreException)e.getCause()).getStatus());
			}else{
				notifyError(e.getMessage());
			}
		} catch (InterruptedException e) {
			notifyError(e.getMessage());
		}
	}

	/**
	 * Stop trace
	 * 
	 * @return
	 */
	public IPath stopTrace() {
		final IPath[] path = new Path[1];
		try {
			IRunnableWithProgress runnableWithProgress = new IRunnableWithProgress() {
				public void run(IProgressMonitor monitor)
						throws InvocationTargetException, InterruptedException {
					monitor.beginTask(Messages.getString("TraceHandler.creatingProfilerDataFile"), //$NON-NLS-1$
							IProgressMonitor.UNKNOWN);
					try {					
						path[0] = PiPlugin.getTraceProvider().stopTrace(false);	
					} catch (CoreException e) {
						throw new InvocationTargetException(e);
					} finally {
						monitor.done();
					}
				}
			};
			wizardContainer.run(true, false, runnableWithProgress);
			return path[0];
		} catch (InvocationTargetException e) {
			if(e.getCause() instanceof CoreException){
				updateStatus(((CoreException)e.getCause()).getStatus());
			}else{
				notifyError(e.getMessage());
			}
			
		} catch (InterruptedException e) {
			notifyError(e.getMessage());
		}
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.nokia.carbide.cpp.pi.export.ITraceClientNotificationsIf#notifyError
	 * (java.lang.String)
	 */
	public void notifyError(String message) {
		updateStatus(createStatus(IStatus.ERROR, message));

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.nokia.carbide.cpp.pi.export.ITraceClientNotificationsIf#notifyInformation
	 * (java.lang.String)
	 */
	public void notifyInformation(String message) {
		updateStatus(createStatus(IStatus.INFO, message));

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.nokia.carbide.cpp.pi.export.ITraceClientNotificationsIf#notifyWarning
	 * (java.lang.String)
	 */
	public void notifyWarning(String message) {
		updateStatus(createStatus(IStatus.WARNING, message));

	}

	/**
	 * Update status for the wizard
	 * 
	 * @param status
	 */
	private void updateStatus(final IStatus status) {	
		Display.getDefault().asyncExec(new Runnable() {
			public void run() {				
				wizardPage.setErrorMessage(null);		
				profilerActivatorGroup.updateButtons();
				if (status.getSeverity() == IStatus.OK) {
					wizardPage.setMessage(status.getMessage());
					wizardPage.setPageComplete(true);
				} else if (status.getSeverity() == IStatus.ERROR) {					
					wizardPage.setErrorMessage(status.getMessage());
					wizardPage.setPageComplete(false);
				} else if (status.getSeverity() == IStatus.INFO) {
					wizardPage.setMessage(status.getMessage());
					wizardPage.setPageComplete(false);
				} else if (status.getSeverity() == IStatus.WARNING) {
					wizardPage.setMessage(status.getMessage());
					wizardPage.setPageComplete(true);
				}else if (status.getSeverity() == IStatus.CANCEL) {
					wizardPage.setMessage(status.getMessage());
					wizardPage.setPageComplete(false);
				}

			}
		});
	}

	/**
	 * Create a status
	 * 
	 * @param severity
	 *            of the status
	 * @param message
	 *            of the status
	 * @return created status
	 */
	private IStatus createStatus(int severity, String message) {
		return new Status(severity, WizardsPlugin.PLUGIN_ID, message);
	}

	/*
	 * (non-Javadoc)
	 * @see com.nokia.carbide.cpp.pi.export.ITraceClientNotificationsIf#updateTraceDataFile(org.eclipse.core.runtime.IPath, long, long)
	 */
	public void updateTraceDataFile(IPath path, long time, long size) {
		profilerActivatorGroup.updateTraceDataFile(path, time, size);
		
	}
}