trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/engine/dataprocessor/VariableTracingProcessor.java
author Jussi Ryoma <ext-jussi.s.ryoma@nokia.com>
Tue, 24 Aug 2010 14:01:48 +0300
changeset 16 72f198be1c1d
parent 11 5b9d4d8641ce
permissions -rw-r--r--
Crash Analyser Carbide Extension 1.4.0

/*
 * Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). 
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "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:
 *
 * VariableTracingProcessor DataProcessor
 *
 */
package com.nokia.traceviewer.engine.dataprocessor;

import java.util.ArrayList;
import java.util.List;

import com.nokia.traceviewer.TraceViewerPlugin;
import com.nokia.traceviewer.action.TraceViewerActionUtils;
import com.nokia.traceviewer.dialog.VariableTracingDialog;
import com.nokia.traceviewer.dialog.treeitem.TreeItem;
import com.nokia.traceviewer.dialog.treeitem.TreeItemContentProvider;
import com.nokia.traceviewer.dialog.treeitem.TreeItemListener;
import com.nokia.traceviewer.dialog.treeitem.VariableTracingTreeBaseItem;
import com.nokia.traceviewer.dialog.treeitem.VariableTracingTreeItem;
import com.nokia.traceviewer.dialog.treeitem.VariableTracingTreeTextItem;
import com.nokia.traceviewer.engine.TraceProperties;
import com.nokia.traceviewer.engine.TraceViewerGlobals;
import com.nokia.traceviewer.engine.TraceViewerPropertyViewInterface;
import com.nokia.traceviewer.engine.TraceViewerDialogInterface.Dialog;
import com.nokia.traceviewer.engine.preferences.PreferenceConstants;
import com.nokia.traceviewer.engine.preferences.XMLVariableTracingConfigurationImporter;

/**
 * VariableTracing DataProcessor
 * 
 */
public final class VariableTracingProcessor implements DataProcessor {

	/**
	 * Interval how often to update progressbar
	 */
	private static final int PROGRESSBAR_UPDATE_INTERVAL = 100;

	/**
	 * Variable Tracing dialog used in setting rules
	 */
	private VariableTracingDialog variableTracingDialog;

	/**
	 * Content provider for the dialog
	 */
	private TreeItemContentProvider contentProvider;

	/**
	 * First visible object in the dialog tree
	 */
	private TreeItem root;

	/**
	 * List of variable tracing items
	 */
	private final List<VariableTracingItem> variableTracingItems;

	/**
	 * Text rules that are applied
	 */
	private final List<VariableTracingTreeTextItem> textRules;

	/**
	 * Constructor
	 */
	public VariableTracingProcessor() {
		createInitialTree();
		variableTracingItems = new ArrayList<VariableTracingItem>();
		textRules = new ArrayList<VariableTracingTreeTextItem>();

	}

	/**
	 * Creates initial tree
	 */
	public void createInitialTree() {
		contentProvider = new TreeItemContentProvider();
		// Create root node
		TreeItem treeRoot = new VariableTracingTreeBaseItem(contentProvider,
				null, "root", VariableTracingTreeItem.Rule.GROUP); //$NON-NLS-1$
		root = new VariableTracingTreeBaseItem(contentProvider, treeRoot,
				TraceViewerPlugin.getDefault().getPreferenceStore().getString(
						PreferenceConstants.CONFIGURATION_FILE),
				VariableTracingTreeItem.Rule.GROUP);
		treeRoot.addChild(root);
	}

	/**
	 * Imports line count rules from configuration file
	 */
	public void importVariableTracingRules() {
		// Import rules
		XMLVariableTracingConfigurationImporter importer = new XMLVariableTracingConfigurationImporter(
				root, TraceViewerPlugin.getDefault().getPreferenceStore()
						.getString(PreferenceConstants.CONFIGURATION_FILE),
				true);
		importer.importData();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.nokia.traceviewer.engine.DataProcessor#processData(com.nokia.traceviewer
	 * .engine.TraceProperties)
	 */
	public void processData(TraceProperties properties) {
		if (!properties.traceConfiguration.isScrolledTrace()
				&& !properties.traceConfiguration.isFilteredOut()
				&& !properties.traceConfiguration.isTriggeredOut()) {
			int len = variableTracingItems.size();
			if (len > 0) {

				// Loop through variable tracing items
				VariableTracingItem item;
				for (int i = 0; i < len; i++) {
					item = variableTracingItems.get(i);

					String traceLine = ""; //$NON-NLS-1$

					// Traces missing
					if (properties.bTraceInformation.isTraceMissing()) {
						traceLine = TraceViewerActionUtils.TRACES_DROPPED_MSG;
					}
					if (properties.traceString != null) {
						traceLine += properties.traceString;
					}

					String rule = item.getTextToCompare();
					if (rule == null) {
						break;
					}

					String checkString = traceLine;
					if (!item.isMatchCase()) {
						checkString = checkString.toLowerCase();
					}

					// Line hits
					if (checkString.contains(rule)) {
						VariableTracingEvent event = new VariableTracingEvent(
								item,
								properties.timestampString,
								traceLine.substring(checkString.indexOf(rule)
										+ rule.length()),
								TraceViewerGlobals.getTraceViewer()
										.getDataReaderAccess()
										.getCurrentDataReader().getTraceCount(),
								properties.information);
						item.addEvent(event);
						item.setChanged(true);
						TraceViewerPropertyViewInterface view = TraceViewerGlobals
								.getTraceViewer().getPropertyView();
						if (view != null) {
							view.setVariableTracingTableChanged();
						}
					}
				}

				// Update progressbar if needed
				updateProgressBar();
			}
		}
	}

	/**
	 * Update progressbar if needed
	 */
	private void updateProgressBar() {
		// Update possible progressBar
		if (isProcessingTracing()
				&& TraceViewerGlobals.getTraceViewer().getDataReaderAccess()
						.getCurrentDataReader().getTraceCount()
						% PROGRESSBAR_UPDATE_INTERVAL == 0) {

			variableTracingDialog.getProgressBar().updateProgressBar(
					TraceViewerGlobals.getTraceViewer().getDataReaderAccess()
							.getCurrentDataReader().getTraceCount());
		}
	}

	/**
	 * Tells if initial tracing is in process
	 * 
	 * @return true if initial tracing is in progress
	 */
	public boolean isProcessingTracing() {
		return (variableTracingDialog != null
				&& variableTracingDialog.getProgressBar() != null
				&& variableTracingDialog.getProgressBar().getShell() != null && !variableTracingDialog
				.getProgressBar().getShell().isDisposed());
	}

	/**
	 * Gets variable tracing dialog
	 * 
	 * @return variable tracing dialog
	 */
	public VariableTracingDialog getVariableTracingDialog() {
		if (variableTracingDialog == null) {
			variableTracingDialog = (VariableTracingDialog) TraceViewerGlobals
					.getTraceViewer().getDialogs().createDialog(
							Dialog.VARIABLETRACING);
		}
		return variableTracingDialog;
	}

	/**
	 * Gets root of the tree
	 * 
	 * @return root
	 */
	public TreeItem getRoot() {
		return root;
	}

	/**
	 * Gets item listener
	 * 
	 * @return the contentProvider
	 */
	public TreeItemListener getTreeItemListener() {
		return contentProvider;
	}

	/**
	 * Gets VariableTracingItems
	 * 
	 * @return the VariableTracingItems
	 */
	public List<VariableTracingItem> getVariableTracingItems() {
		return variableTracingItems;
	}

	/**
	 * Empty variablesTracingItems
	 */
	public void emptyVariableTracingItems() {
		for (int i = 0; i < variableTracingItems.size(); i++) {
			variableTracingItems.get(i).clear();
			variableTracingItems.get(i).setChanged(true);
		}
	}

	/**
	 * Gets text rules
	 * 
	 * @return text rules
	 */
	public List<VariableTracingTreeTextItem> getTextRules() {
		return textRules;
	}

	/**
	 * Enable variabletracing rule
	 * 
	 * @param item
	 *            the rule item
	 */
	public void enableRule(VariableTracingTreeItem item) {
		if (item instanceof VariableTracingTreeTextItem) {
			VariableTracingTreeTextItem item2 = (VariableTracingTreeTextItem) item;
			VariableTracingItem newItem = new VariableTracingItem(item2
					.getName(), item2.getText(), item2.isMatchCase(), item2
					.getHistoryCount());
			textRules.add((VariableTracingTreeTextItem) item);
			variableTracingItems.add(newItem);
		}

		if (TraceViewerGlobals.getTraceViewer().getPropertyView() != null) {
			TraceViewerGlobals.getTraceViewer().getPropertyView()
					.createNewPropertyTableItems();
		}
	}
}