tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompiler.java
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
parent 41 tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/TraceCompiler.java@838cdffd57ce
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 * TraceCompiler command-line main class
hgs
parents:
diff changeset
    17
 *
hgs
parents:
diff changeset
    18
 */
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.io.BufferedReader;
hgs
parents:
diff changeset
    22
import java.io.File;
hgs
parents:
diff changeset
    23
import java.io.IOException;
hgs
parents:
diff changeset
    24
import java.io.InputStreamReader;
hgs
parents:
diff changeset
    25
import java.net.URL;
hgs
parents:
diff changeset
    26
import java.util.ArrayList;
hgs
parents:
diff changeset
    27
import java.util.Arrays;
hgs
parents:
diff changeset
    28
import java.util.List;
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.document.FileDocumentMonitor;
hgs
parents:
diff changeset
    31
import com.nokia.tracecompiler.document.StringDocumentFactory;
hgs
parents:
diff changeset
    32
import com.nokia.tracecompiler.engine.TraceCompilerEngineEvents;
hgs
parents:
diff changeset
    33
import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
hgs
parents:
diff changeset
    34
import com.nokia.tracecompiler.engine.TraceCompilerEngineInterface;
hgs
parents:
diff changeset
    35
import com.nokia.tracecompiler.engine.TraceLocationList;
hgs
parents:
diff changeset
    36
import com.nokia.tracecompiler.engine.project.ProjectEngine;
hgs
parents:
diff changeset
    37
import com.nokia.tracecompiler.engine.utils.TraceUtils;
hgs
parents:
diff changeset
    38
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    39
import com.nokia.tracecompiler.model.TraceModel;
hgs
parents:
diff changeset
    40
import com.nokia.tracecompiler.plugin.TraceCompilerPlugin;
hgs
parents:
diff changeset
    41
import com.nokia.tracecompiler.project.GroupNames;
hgs
parents:
diff changeset
    42
import com.nokia.tracecompiler.source.SourceConstants;
hgs
parents:
diff changeset
    43
import com.nokia.tracecompiler.source.SymbianConstants;
hgs
parents:
diff changeset
    44
import com.nokia.tracecompiler.utils.DocumentFactory;
hgs
parents:
diff changeset
    45
import com.nokia.tracecompiler.utils.TraceCompilerVersion;
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
/**
hgs
parents:
diff changeset
    48
 * TraceCompiler command-line main class
hgs
parents:
diff changeset
    49
 * 
hgs
parents:
diff changeset
    50
 */
hgs
parents:
diff changeset
    51
public class TraceCompiler {
hgs
parents:
diff changeset
    52
	
hgs
parents:
diff changeset
    53
	private static String LINE_SEPARATOR =  System.getProperty("line.separator"); //$NON-NLS-1$
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
	/**
hgs
parents:
diff changeset
    56
	 * Index of third character
hgs
parents:
diff changeset
    57
	 */
hgs
parents:
diff changeset
    58
	private static final int INDEX_OF_THIRD_CHARACTER = 2;
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
	/**
hgs
parents:
diff changeset
    61
	 * Index of first character
hgs
parents:
diff changeset
    62
	 */
hgs
parents:
diff changeset
    63
	private static final int INDEX_OF_FIRST_CHARACTER = 0;
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
	/**
hgs
parents:
diff changeset
    66
	 * Version option
hgs
parents:
diff changeset
    67
	 */
hgs
parents:
diff changeset
    68
	private static final String VERSION_OPTION = "--version"; //$NON-NLS-1$
hgs
parents:
diff changeset
    69
	private static final String LEGACY_VERSION_OPTION = "-version"; //$NON-NLS-1$
hgs
parents:
diff changeset
    70
	private static final String VERSION_OPTION_SF = "-v"; //$NON-NLS-1$
hgs
parents:
diff changeset
    71
	/**
hgs
parents:
diff changeset
    72
	 * Version option instruction text
hgs
parents:
diff changeset
    73
	 */
hgs
parents:
diff changeset
    74
	private static final String VERSION_OPTION_INSTRUCTION_TEXT = "print TraceCompiler version"; //$NON-NLS-1$
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
	
hgs
parents:
diff changeset
    77
	/**
hgs
parents:
diff changeset
    78
	 * help option
hgs
parents:
diff changeset
    79
	 */
hgs
parents:
diff changeset
    80
	private static final String HELP_OPTION = "--help"; //$NON-NLS-1$
hgs
parents:
diff changeset
    81
	private static final String HELP_OPTION_SF = "-h"; //$NON-NLS-1$
hgs
parents:
diff changeset
    82
	private static final String HELP_OPTION_INSTRUCTION_TEXT = "print help"; //$NON-NLS-1$
hgs
parents:
diff changeset
    83
	
hgs
parents:
diff changeset
    84
	/**
hgs
parents:
diff changeset
    85
	 * Verbose option
hgs
parents:
diff changeset
    86
	 */
hgs
parents:
diff changeset
    87
	private static final String VERBOSE_OPTION = "--verbose"; //$NON-NLS-1$
hgs
parents:
diff changeset
    88
	private static final String VERBOSE_OPTION_SF = "-vb"; //$NON-NLS-1$
hgs
parents:
diff changeset
    89
	/**
hgs
parents:
diff changeset
    90
	 * Verbose option instruction text
hgs
parents:
diff changeset
    91
	 */
hgs
parents:
diff changeset
    92
	private static final String VERBOSE_OPTION_INSTRUCTION_TEXT = "print info messages."; //$NON-NLS-1$
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
	/**
hgs
parents:
diff changeset
    95
	 * keep going option
hgs
parents:
diff changeset
    96
	 */
hgs
parents:
diff changeset
    97
	private static final String STOP_ON_ERROR_OPTION = "--stopOnError"; //$NON-NLS-1$
hgs
parents:
diff changeset
    98
	private static final String STOP_ON_ERROR_OPTION_SF = "-soe"; //$NON-NLS-1$
hgs
parents:
diff changeset
    99
	/**
hgs
parents:
diff changeset
   100
	 * keep going option instruction text
hgs
parents:
diff changeset
   101
	 */
hgs
parents:
diff changeset
   102
	private static final String STOP_ON_ERROR_OPTION_INSTRUCTION_TEXT = "On error, stop at the end of the compilation unit."; //$NON-NLS-1$
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
	
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
	/**
hgs
parents:
diff changeset
   107
	 * Version text
hgs
parents:
diff changeset
   108
	 */
hgs
parents:
diff changeset
   109
	private static final String VERSION_TEXT = "TraceCompiler version "; //$NON-NLS-1$
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
	/**
hgs
parents:
diff changeset
   112
	 * Option instruction text
hgs
parents:
diff changeset
   113
	 */
hgs
parents:
diff changeset
   114
	private static final String OPTION_INSTRUCTION_TEXT = "Options:"; //$NON-NLS-1$
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
	
hgs
parents:
diff changeset
   117
	private static final String USAGE = "Usage: " + LINE_SEPARATOR + //$NON-NLS-1$
hgs
parents:
diff changeset
   118
										"tracecompiler [options] Component_UID [Component_name MMP_path source_file...]" + LINE_SEPARATOR + //$NON-NLS-1$
hgs
parents:
diff changeset
   119
										"\t" + OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR + //$NON-NLS-1$
hgs
parents:
diff changeset
   120
										"\t" + HELP_OPTION_SF  + ", " + HELP_OPTION + ", " + HELP_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
hgs
parents:
diff changeset
   121
										"\t" + VERSION_OPTION_SF + ", " + VERSION_OPTION + ", " + LEGACY_VERSION_OPTION + "\t" +  VERSION_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ //$NON-NLS-4$
hgs
parents:
diff changeset
   122
										"\t" + VERBOSE_OPTION_SF + ", " + VERBOSE_OPTION + "\t\t" + VERBOSE_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR +  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
hgs
parents:
diff changeset
   123
										"\t" + STOP_ON_ERROR_OPTION_SF + ", " + STOP_ON_ERROR_OPTION + "\t" + STOP_ON_ERROR_OPTION_INSTRUCTION_TEXT + LINE_SEPARATOR;  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
	/**
hgs
parents:
diff changeset
   128
	 * End of source files tag
hgs
parents:
diff changeset
   129
	 */
hgs
parents:
diff changeset
   130
	private static final String ENDOFSOURCEFILES = "*ENDOFSOURCEFILES*"; //$NON-NLS-1$
hgs
parents:
diff changeset
   131
	
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
	/**
hgs
parents:
diff changeset
   134
	 * Offset to UID
hgs
parents:
diff changeset
   135
	 */
hgs
parents:
diff changeset
   136
	private static final int COMPONENT_UID_ARG = 0;
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
	/**
hgs
parents:
diff changeset
   139
	 * Offset to component name
hgs
parents:
diff changeset
   140
	 */
hgs
parents:
diff changeset
   141
	private static final int COMPONENT_NAME_ARG = 1;
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
	/**
hgs
parents:
diff changeset
   144
	 * Offset to MMP path
hgs
parents:
diff changeset
   145
	 */
hgs
parents:
diff changeset
   146
	private static final int COMPONENT_MMP_PATH_ARG = 2; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
	/**
hgs
parents:
diff changeset
   149
	 * Offset to source files
hgs
parents:
diff changeset
   150
	 */
hgs
parents:
diff changeset
   151
	private static final int SOURCE_FILE_START_OFFSET = 3; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
	/**
hgs
parents:
diff changeset
   154
	 * Number of arguments
hgs
parents:
diff changeset
   155
	 */
hgs
parents:
diff changeset
   156
	private static final int MANDATORY_ARGUMENT_COUNT = 1;
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
	/**
hgs
parents:
diff changeset
   159
	 * MMP file extension
hgs
parents:
diff changeset
   160
	 */
hgs
parents:
diff changeset
   161
	private static final String MMP = ".mmp"; //$NON-NLS-1$
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
	/**
hgs
parents:
diff changeset
   164
	 * Underscore character
hgs
parents:
diff changeset
   165
	 */
hgs
parents:
diff changeset
   166
	private static final String UNDERSCORE = "_"; //$NON-NLS-1$
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
	/**
hgs
parents:
diff changeset
   169
	 * Name of the trace folder that include component name
hgs
parents:
diff changeset
   170
	 */
hgs
parents:
diff changeset
   171
	private String traceFolderName;
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
	/**
hgs
parents:
diff changeset
   174
	 * Decode plugins path
hgs
parents:
diff changeset
   175
	 */
hgs
parents:
diff changeset
   176
	private String DECODE_PLUGINS_PATH = "com/nokia/tracecompiler/decodeplugins"; //$NON-NLS-1$
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
	/**
hgs
parents:
diff changeset
   179
	 * Decode plugin name tag
hgs
parents:
diff changeset
   180
	 */
hgs
parents:
diff changeset
   181
	private String DECODE_PLUGIN_NAME_TAG = "<DECODE_PLUGIN_NAME>"; //$NON-NLS-1$
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
	/**
hgs
parents:
diff changeset
   184
	 * Decode plugin class name tag
hgs
parents:
diff changeset
   185
	 */
hgs
parents:
diff changeset
   186
	private String DECODE_PLUGIN_CLASS_NAME_TAG = "<DECODE_PLUGIN_CLASS_NAME>"; //$NON-NLS-1$
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
	/**
hgs
parents:
diff changeset
   189
	 * Decode plugin engine class name template
hgs
parents:
diff changeset
   190
	 */
hgs
parents:
diff changeset
   191
	private String ENGINE_CLASS_NAME_TEMPLATE = DECODE_PLUGIN_NAME_TAG
hgs
parents:
diff changeset
   192
			+ "Engine"; //$NON-NLS-1$
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
	/**
hgs
parents:
diff changeset
   195
	 * Decode plugin engine file name template
hgs
parents:
diff changeset
   196
	 */
hgs
parents:
diff changeset
   197
	private String ENGINE_FILE_NAME_TEMPLATE = DECODE_PLUGIN_CLASS_NAME_TAG
hgs
parents:
diff changeset
   198
			+ ".class"; //$NON-NLS-1$
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
	/**
hgs
parents:
diff changeset
   201
	 * Decode plugins class template
hgs
parents:
diff changeset
   202
	 */
hgs
parents:
diff changeset
   203
	private String CLASS_TEMPLATE = "com.nokia.tracecompiler.decodeplugins." + DECODE_PLUGIN_NAME_TAG + "." + DECODE_PLUGIN_CLASS_NAME_TAG; //$NON-NLS-1$ //$NON-NLS-2$	
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
	/**
hgs
parents:
diff changeset
   206
	 * Main function
hgs
parents:
diff changeset
   207
	 * 
hgs
parents:
diff changeset
   208
	 * @param args
hgs
parents:
diff changeset
   209
	 *            the command line arguments
hgs
parents:
diff changeset
   210
	 */
hgs
parents:
diff changeset
   211
	public static void main(String[] args) {
hgs
parents:
diff changeset
   212
		ArrayList<String> list = new ArrayList<String>(Arrays.asList(args));
hgs
parents:
diff changeset
   213
		long startTime = System.currentTimeMillis();
hgs
parents:
diff changeset
   214
		//create a new session of TraceCompiler
hgs
parents:
diff changeset
   215
		TraceCompiler console = new TraceCompiler();
hgs
parents:
diff changeset
   216
		
hgs
parents:
diff changeset
   217
		try {
hgs
parents:
diff changeset
   218
			console.parseCommandLine(list);
hgs
parents:
diff changeset
   219
		} catch (Exception e) { //should cover IOException and TraceCompilerIllegalArgumentsException
hgs
parents:
diff changeset
   220
			//There is no point to continue if there are problems with the arguments.
hgs
parents:
diff changeset
   221
			TraceCompilerLogger.printError(e.getMessage());
hgs
parents:
diff changeset
   222
			printUsage();
hgs
parents:
diff changeset
   223
			System.exit(1);
hgs
parents:
diff changeset
   224
		}
hgs
parents:
diff changeset
   225
		
hgs
parents:
diff changeset
   226
		boolean error = false;
hgs
parents:
diff changeset
   227
		try {
hgs
parents:
diff changeset
   228
			if(list.size() != 0) {
hgs
parents:
diff changeset
   229
				console.createPlugins();
hgs
parents:
diff changeset
   230
				console.start();
hgs
parents:
diff changeset
   231
				console.buildTraceFiles();
hgs
parents:
diff changeset
   232
				
hgs
parents:
diff changeset
   233
			}
hgs
parents:
diff changeset
   234
		} catch (Exception e) {
hgs
parents:
diff changeset
   235
			if (e instanceof TraceCompilerRootException) {
hgs
parents:
diff changeset
   236
				TraceCompilerLogger.printError(e.getMessage()); 
hgs
parents:
diff changeset
   237
			} //else the error should have been reported earlier
hgs
parents:
diff changeset
   238
			error = true;
hgs
parents:
diff changeset
   239
		} finally {
hgs
parents:
diff changeset
   240
			try {
hgs
parents:
diff changeset
   241
				if (!error) { //check if errors have been logged by EventEngine
hgs
parents:
diff changeset
   242
					TraceCompilerEngineEvents events = TraceCompilerEngineGlobals.getEvents();
hgs
parents:
diff changeset
   243
					if (events != null && events.hasErrorHappened()) {
hgs
parents:
diff changeset
   244
						error = true;
hgs
parents:
diff changeset
   245
					}
hgs
parents:
diff changeset
   246
				}
hgs
parents:
diff changeset
   247
				console.shutdown();
hgs
parents:
diff changeset
   248
			} catch (TraceCompilerException e) {
hgs
parents:
diff changeset
   249
				error = true;
hgs
parents:
diff changeset
   250
			}
hgs
parents:
diff changeset
   251
		}
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
		if (console.componentName != null) {
hgs
parents:
diff changeset
   254
			TraceCompilerLogger.printMessage(console.componentName + " took " //$NON-NLS-1$
hgs
parents:
diff changeset
   255
					+ (System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
hgs
parents:
diff changeset
   256
		}
hgs
parents:
diff changeset
   257
		if (error) {
hgs
parents:
diff changeset
   258
			System.exit(1);
hgs
parents:
diff changeset
   259
		} else {
hgs
parents:
diff changeset
   260
			System.exit(0);
hgs
parents:
diff changeset
   261
		}	
hgs
parents:
diff changeset
   262
	}
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
	/**
hgs
parents:
diff changeset
   265
	 * With Eclipse, the plug-ins are loaded by Eclipse framework. Here they
hgs
parents:
diff changeset
   266
	 * must be manually created and started
hgs
parents:
diff changeset
   267
	 */
hgs
parents:
diff changeset
   268
	private ArrayList<TraceCompilerPlugin> plugIns = new ArrayList<TraceCompilerPlugin>();
hgs
parents:
diff changeset
   269
hgs
parents:
diff changeset
   270
	/**
hgs
parents:
diff changeset
   271
	 * Model listener
hgs
parents:
diff changeset
   272
	 */
hgs
parents:
diff changeset
   273
	private TraceCompilerModelListener modelListener;
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
	/**
hgs
parents:
diff changeset
   276
	 * Name of the component
hgs
parents:
diff changeset
   277
	 */
hgs
parents:
diff changeset
   278
	private String componentName;
hgs
parents:
diff changeset
   279
hgs
parents:
diff changeset
   280
	/**
hgs
parents:
diff changeset
   281
	 * UID of the component
hgs
parents:
diff changeset
   282
	 */
hgs
parents:
diff changeset
   283
	private long componentUID;
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
	/**
hgs
parents:
diff changeset
   286
	 * Component path
hgs
parents:
diff changeset
   287
	 */
hgs
parents:
diff changeset
   288
	private String componentPath;
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
	/**
hgs
parents:
diff changeset
   291
	 * MMP file path
hgs
parents:
diff changeset
   292
	 */
hgs
parents:
diff changeset
   293
	private File mmpPath;
hgs
parents:
diff changeset
   294
hgs
parents:
diff changeset
   295
	/**
hgs
parents:
diff changeset
   296
	 * Constructor
hgs
parents:
diff changeset
   297
	 */
hgs
parents:
diff changeset
   298
	TraceCompiler() {
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
		// Creates listeners and preferences
hgs
parents:
diff changeset
   301
		modelListener = new TraceCompilerModelListener();
hgs
parents:
diff changeset
   302
	}
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
	/**
hgs
parents:
diff changeset
   305
	 * Creates the plug-ins to be registered with TraceCompiler
hgs
parents:
diff changeset
   306
	 * @throws TraceCompilerRootException if fail to create a valid plugins
hgs
parents:
diff changeset
   307
	 */
hgs
parents:
diff changeset
   308
	private void createPlugins() throws TraceCompilerRootException {
hgs
parents:
diff changeset
   309
		
hgs
parents:
diff changeset
   310
		// Get location of the TraceCompiler
hgs
parents:
diff changeset
   311
		URL path = getClass().getProtectionDomain().getCodeSource()
hgs
parents:
diff changeset
   312
				.getLocation();
hgs
parents:
diff changeset
   313
		String decodePluginsPath = path.getPath();
hgs
parents:
diff changeset
   314
hgs
parents:
diff changeset
   315
		// If first character is forward slash and it is located before drive
hgs
parents:
diff changeset
   316
		// letter remove it
hgs
parents:
diff changeset
   317
		if (decodePluginsPath.charAt(INDEX_OF_FIRST_CHARACTER) == SourceConstants.FORWARD_SLASH_CHAR
hgs
parents:
diff changeset
   318
				&& decodePluginsPath.charAt(INDEX_OF_THIRD_CHARACTER) == SourceConstants.COLON_CHAR) {
hgs
parents:
diff changeset
   319
			decodePluginsPath = decodePluginsPath.substring(1);
hgs
parents:
diff changeset
   320
		}
hgs
parents:
diff changeset
   321
		
hgs
parents:
diff changeset
   322
		// Concatenate decode plugins path
hgs
parents:
diff changeset
   323
		decodePluginsPath = decodePluginsPath.concat(DECODE_PLUGINS_PATH);
hgs
parents:
diff changeset
   324
		
hgs
parents:
diff changeset
   325
		// Replace slashes with correct separator character
hgs
parents:
diff changeset
   326
		decodePluginsPath = decodePluginsPath.replace(
hgs
parents:
diff changeset
   327
				SourceConstants.FORWARD_SLASH_CHAR, File.separatorChar);
hgs
parents:
diff changeset
   328
		decodePluginsPath = decodePluginsPath.replace(
hgs
parents:
diff changeset
   329
				SourceConstants.BACKSLASH_CHAR, File.separatorChar);
hgs
parents:
diff changeset
   330
		File decodePluginsDir = new File(decodePluginsPath);
hgs
parents:
diff changeset
   331
		String[] decodePlugins = decodePluginsDir.list();
hgs
parents:
diff changeset
   332
		if (decodePlugins != null) {
hgs
parents:
diff changeset
   333
			for (int i = 0; i < decodePlugins.length; i++) {
hgs
parents:
diff changeset
   334
hgs
parents:
diff changeset
   335
				// Get decode plugin name
hgs
parents:
diff changeset
   336
				String decodePluginName = decodePlugins[i];
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
				// Get decode plugin path
hgs
parents:
diff changeset
   339
				String decodePluginPath = decodePluginsPath
hgs
parents:
diff changeset
   340
						+ File.separatorChar + decodePluginName;
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
				// Decode plugin must be in own directory
hgs
parents:
diff changeset
   343
				Boolean isDirectory = (new File(decodePluginPath))
hgs
parents:
diff changeset
   344
						.isDirectory();
hgs
parents:
diff changeset
   345
				if (isDirectory) {
hgs
parents:
diff changeset
   346
hgs
parents:
diff changeset
   347
					// Construct decode plugin engine class name
hgs
parents:
diff changeset
   348
					String engineClassName = ENGINE_CLASS_NAME_TEMPLATE
hgs
parents:
diff changeset
   349
							.replaceFirst(DECODE_PLUGIN_NAME_TAG,
hgs
parents:
diff changeset
   350
									decodePluginName.substring(0, 1)
hgs
parents:
diff changeset
   351
											.toUpperCase()
hgs
parents:
diff changeset
   352
											+ decodePluginName.substring(1));
hgs
parents:
diff changeset
   353
hgs
parents:
diff changeset
   354
					// Construct decode plugin engine file name
hgs
parents:
diff changeset
   355
					String engineFileName = ENGINE_FILE_NAME_TEMPLATE
hgs
parents:
diff changeset
   356
							.replaceFirst(DECODE_PLUGIN_CLASS_NAME_TAG,
hgs
parents:
diff changeset
   357
									engineClassName);
hgs
parents:
diff changeset
   358
					String engineFileFullName = decodePluginPath
hgs
parents:
diff changeset
   359
							+ File.separatorChar + engineFileName;
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
					// Check does engine file exist
hgs
parents:
diff changeset
   362
					Boolean exists = (new File(engineFileFullName)).exists();
hgs
parents:
diff changeset
   363
					if (exists) {
hgs
parents:
diff changeset
   364
						String engineClassFullName = CLASS_TEMPLATE
hgs
parents:
diff changeset
   365
								.replaceFirst(DECODE_PLUGIN_NAME_TAG,
hgs
parents:
diff changeset
   366
										decodePluginName).replaceFirst(
hgs
parents:
diff changeset
   367
										DECODE_PLUGIN_CLASS_NAME_TAG,
hgs
parents:
diff changeset
   368
										engineClassName);
hgs
parents:
diff changeset
   369
						try {
hgs
parents:
diff changeset
   370
							Class<?> engineClass = Class
hgs
parents:
diff changeset
   371
									.forName(engineClassFullName);
hgs
parents:
diff changeset
   372
							TraceCompilerPlugin engine = (TraceCompilerPlugin) engineClass
hgs
parents:
diff changeset
   373
									.newInstance();
hgs
parents:
diff changeset
   374
							plugIns.add(engine);
hgs
parents:
diff changeset
   375
							TraceCompilerLogger.printInfo("Decode plugin " + engineClassFullName + " added"); //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   376
						} catch (Exception e) {
hgs
parents:
diff changeset
   377
							String msg = "Decode plugin " + engineClassFullName + " adding failed"; //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   378
							throw new TraceCompilerRootException(msg, e); 
hgs
parents:
diff changeset
   379
						}
hgs
parents:
diff changeset
   380
					} else {
hgs
parents:
diff changeset
   381
						String msg = "Decode plugin file " + engineFileFullName + " does not exist"; //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   382
						throw new TraceCompilerRootException(msg, null);
hgs
parents:
diff changeset
   383
					}
hgs
parents:
diff changeset
   384
				}
hgs
parents:
diff changeset
   385
			}
hgs
parents:
diff changeset
   386
		}
hgs
parents:
diff changeset
   387
	}
hgs
parents:
diff changeset
   388
hgs
parents:
diff changeset
   389
	/**
hgs
parents:
diff changeset
   390
	 * Parses the command line
hgs
parents:
diff changeset
   391
	 * 
hgs
parents:
diff changeset
   392
	 * @param args
hgs
parents:
diff changeset
   393
	 *            the arguments
hgs
parents:
diff changeset
   394
	 * @throws TraceCompilerRootException if arguments are invalid
hgs
parents:
diff changeset
   395
	 * @throws IOException 
hgs
parents:
diff changeset
   396
	 */
hgs
parents:
diff changeset
   397
	private void parseCommandLine(ArrayList<String> list) throws TraceCompilerIllegalArgumentsException, IOException {
hgs
parents:
diff changeset
   398
		TraceCompilerLogger.printInfo("Building traces..."); //$NON-NLS-1$
hgs
parents:
diff changeset
   399
		if (list.size() == 0) {
hgs
parents:
diff changeset
   400
			printUsage();
hgs
parents:
diff changeset
   401
			System.exit(0);
hgs
parents:
diff changeset
   402
		}
hgs
parents:
diff changeset
   403
		List<String> switches = new ArrayList<String>();
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
		// version, verbose, keepgoing if available could be anywhere, so process them and remove them from the list
hgs
parents:
diff changeset
   406
		for (String element : list) {
hgs
parents:
diff changeset
   407
			if (element.equalsIgnoreCase(HELP_OPTION) || element.equalsIgnoreCase(HELP_OPTION_SF)) {
hgs
parents:
diff changeset
   408
				printUsage();
hgs
parents:
diff changeset
   409
				System.exit(0);
hgs
parents:
diff changeset
   410
			}
hgs
parents:
diff changeset
   411
			if (element.equalsIgnoreCase(VERBOSE_OPTION) || element.equalsIgnoreCase(VERBOSE_OPTION_SF)) {
hgs
parents:
diff changeset
   412
				TraceCompilerGlobals.setVerbose(true);
hgs
parents:
diff changeset
   413
				switches.add(element);
hgs
parents:
diff changeset
   414
			}
hgs
parents:
diff changeset
   415
			if (element.equalsIgnoreCase(LEGACY_VERSION_OPTION) || element.equalsIgnoreCase(VERSION_OPTION) || element.equalsIgnoreCase(VERSION_OPTION_SF)) {
hgs
parents:
diff changeset
   416
				TraceCompilerLogger.printMessage(VERSION_TEXT + TraceCompilerVersion.getVersion());
hgs
parents:
diff changeset
   417
				System.exit(0);
hgs
parents:
diff changeset
   418
			}
hgs
parents:
diff changeset
   419
			if (element.equalsIgnoreCase(STOP_ON_ERROR_OPTION) || element.equalsIgnoreCase(STOP_ON_ERROR_OPTION_SF)) {
hgs
parents:
diff changeset
   420
				TraceCompilerGlobals.setKeepGoing(false);
hgs
parents:
diff changeset
   421
				switches.add(element);
hgs
parents:
diff changeset
   422
			}
hgs
parents:
diff changeset
   423
		}
hgs
parents:
diff changeset
   424
		
hgs
parents:
diff changeset
   425
		//remove switches from the list
hgs
parents:
diff changeset
   426
		for (String string : switches) {
hgs
parents:
diff changeset
   427
			list.remove(string);
hgs
parents:
diff changeset
   428
		}
hgs
parents:
diff changeset
   429
		
hgs
parents:
diff changeset
   430
		switches = null;
hgs
parents:
diff changeset
   431
		
hgs
parents:
diff changeset
   432
		if (list.size() < MANDATORY_ARGUMENT_COUNT) {
hgs
parents:
diff changeset
   433
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.invalidTraceCompilerArgumetsExceptionText"), null); //$NON-NLS-1$
hgs
parents:
diff changeset
   434
		}
hgs
parents:
diff changeset
   435
		
hgs
parents:
diff changeset
   436
		
hgs
parents:
diff changeset
   437
		//the rest of elements must be in the order COMPONENT_UID, COMPONENT_NAME, COMPONENT_MMP_PATH, source...
hgs
parents:
diff changeset
   438
		//COMPONENT_UID must be on the command line, the rest can either be on the command line or stdin
hgs
parents:
diff changeset
   439
hgs
parents:
diff changeset
   440
		try {
hgs
parents:
diff changeset
   441
			componentUID = Long.parseLong(list.get(COMPONENT_UID_ARG),
hgs
parents:
diff changeset
   442
					TraceCompilerConstants.HEX_RADIX);
hgs
parents:
diff changeset
   443
			TraceCompilerLogger.printInfo("Component UID: 0x" + Long.toHexString(componentUID)); //$NON-NLS-1$
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
		} catch (NumberFormatException e) {
hgs
parents:
diff changeset
   446
			String msg = Messages.getString("TraceCompiler.componentUidIsNotValidExceptionText") + componentUID; //$NON-NLS-1$
hgs
parents:
diff changeset
   447
			throw new TraceCompilerIllegalArgumentsException(msg, null);
hgs
parents:
diff changeset
   448
		}
hgs
parents:
diff changeset
   449
		if (componentUID > 0) {
hgs
parents:
diff changeset
   450
hgs
parents:
diff changeset
   451
			// Arguments are given as a parameter
hgs
parents:
diff changeset
   452
			if (list.size() > MANDATORY_ARGUMENT_COUNT + 1) {
hgs
parents:
diff changeset
   453
				parseParameters(list);
hgs
parents:
diff changeset
   454
hgs
parents:
diff changeset
   455
				// Otherwise, read arguments from STDIN
hgs
parents:
diff changeset
   456
			} else {
hgs
parents:
diff changeset
   457
				readFromStdin();
hgs
parents:
diff changeset
   458
			}
hgs
parents:
diff changeset
   459
		} else {
hgs
parents:
diff changeset
   460
			String msg = Messages.getString("TraceCompiler.componentUidIsNotValidExceptionText") + componentUID; //$NON-NLS-1$
hgs
parents:
diff changeset
   461
			throw new TraceCompilerIllegalArgumentsException(msg, null);
hgs
parents:
diff changeset
   462
		}
hgs
parents:
diff changeset
   463
	}
hgs
parents:
diff changeset
   464
hgs
parents:
diff changeset
   465
hgs
parents:
diff changeset
   466
	private static void printUsage() {
hgs
parents:
diff changeset
   467
		TraceCompilerLogger.printMessage(VERSION_TEXT + TraceCompilerVersion.getVersion());
hgs
parents:
diff changeset
   468
		TraceCompilerLogger.printMessage(USAGE);
hgs
parents:
diff changeset
   469
	}
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
	/**
hgs
parents:
diff changeset
   472
	 * Parses parameters
hgs
parents:
diff changeset
   473
	 * 
hgs
parents:
diff changeset
   474
	 * @param args
hgs
parents:
diff changeset
   475
	 *            the parameters
hgs
parents:
diff changeset
   476
	 * @throws TraceCompilerRootException if arguments are not valid
hgs
parents:
diff changeset
   477
	 */
hgs
parents:
diff changeset
   478
	private void parseParameters(List<String> args) throws TraceCompilerIllegalArgumentsException {
hgs
parents:
diff changeset
   479
		//index is safe, already checked by the caller
hgs
parents:
diff changeset
   480
		componentName = args.get(COMPONENT_NAME_ARG);
hgs
parents:
diff changeset
   481
		traceFolderName = 	TraceCompilerConstants.TRACES_DIRECTORY + UNDERSCORE
hgs
parents:
diff changeset
   482
							+ componentName;
hgs
parents:
diff changeset
   483
		
hgs
parents:
diff changeset
   484
		mmpPath = new File(args.get(COMPONENT_MMP_PATH_ARG));
hgs
parents:
diff changeset
   485
hgs
parents:
diff changeset
   486
		if (isMmpValid()) {
hgs
parents:
diff changeset
   487
hgs
parents:
diff changeset
   488
			// Move the files from args array to source file list
hgs
parents:
diff changeset
   489
				ArrayList<String> sources = new ArrayList<String>();
hgs
parents:
diff changeset
   490
				for (int i = 0; i < args.size() - SOURCE_FILE_START_OFFSET; i++) {
hgs
parents:
diff changeset
   491
					sources.add(args.get(SOURCE_FILE_START_OFFSET + i));
hgs
parents:
diff changeset
   492
				}
hgs
parents:
diff changeset
   493
hgs
parents:
diff changeset
   494
				registerFiles(sources);
hgs
parents:
diff changeset
   495
		} else {
hgs
parents:
diff changeset
   496
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.invalidMmpExceptionText") + mmpPath, null); //$NON-NLS-1$
hgs
parents:
diff changeset
   497
		}
hgs
parents:
diff changeset
   498
		
hgs
parents:
diff changeset
   499
	}
hgs
parents:
diff changeset
   500
hgs
parents:
diff changeset
   501
	/**
hgs
parents:
diff changeset
   502
	 * Read information from STDIN
hgs
parents:
diff changeset
   503
	 * @throws IOException if fails to read the input
hgs
parents:
diff changeset
   504
	 * @throws TraceCompilerRootException if the list of files is empty
hgs
parents:
diff changeset
   505
	 */
hgs
parents:
diff changeset
   506
	private void readFromStdin() throws IOException, TraceCompilerIllegalArgumentsException {
hgs
parents:
diff changeset
   507
		ArrayList<String> files = new ArrayList<String>();
hgs
parents:
diff changeset
   508
hgs
parents:
diff changeset
   509
		// Create reader
hgs
parents:
diff changeset
   510
		BufferedReader stdin = new BufferedReader(
hgs
parents:
diff changeset
   511
				new InputStreamReader(System.in));
hgs
parents:
diff changeset
   512
		
hgs
parents:
diff changeset
   513
			int numberOfReceivedLines = 1;
hgs
parents:
diff changeset
   514
hgs
parents:
diff changeset
   515
			String line = stdin.readLine();
hgs
parents:
diff changeset
   516
						
hgs
parents:
diff changeset
   517
			while (line != null) {
hgs
parents:
diff changeset
   518
hgs
parents:
diff changeset
   519
				// End of source files received
hgs
parents:
diff changeset
   520
				if (line.equals(ENDOFSOURCEFILES)) {
hgs
parents:
diff changeset
   521
					break;
hgs
parents:
diff changeset
   522
				}
hgs
parents:
diff changeset
   523
hgs
parents:
diff changeset
   524
				// Component name
hgs
parents:
diff changeset
   525
				if (numberOfReceivedLines == COMPONENT_NAME_ARG) {
hgs
parents:
diff changeset
   526
					componentName = line;
hgs
parents:
diff changeset
   527
					traceFolderName = TraceCompilerConstants.TRACES_DIRECTORY
hgs
parents:
diff changeset
   528
							+ UNDERSCORE + componentName;
hgs
parents:
diff changeset
   529
hgs
parents:
diff changeset
   530
					// MMP path
hgs
parents:
diff changeset
   531
				} else if (numberOfReceivedLines == COMPONENT_MMP_PATH_ARG) {
hgs
parents:
diff changeset
   532
					mmpPath = new File(line);
hgs
parents:
diff changeset
   533
					if (!isMmpValid()) {
hgs
parents:
diff changeset
   534
						stdin.close();
hgs
parents:
diff changeset
   535
						throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.invalidMmpExceptionText") + mmpPath, null); //$NON-NLS-1$
hgs
parents:
diff changeset
   536
					}
hgs
parents:
diff changeset
   537
hgs
parents:
diff changeset
   538
					// Source files
hgs
parents:
diff changeset
   539
				} else {
hgs
parents:
diff changeset
   540
					// Add to the files list
hgs
parents:
diff changeset
   541
					File file = new File(line);
hgs
parents:
diff changeset
   542
					files.add(file.getAbsolutePath());
hgs
parents:
diff changeset
   543
				}
hgs
parents:
diff changeset
   544
hgs
parents:
diff changeset
   545
				numberOfReceivedLines++;
hgs
parents:
diff changeset
   546
hgs
parents:
diff changeset
   547
				// Read new line from STDIN
hgs
parents:
diff changeset
   548
				line = stdin.readLine();				
hgs
parents:
diff changeset
   549
			}
hgs
parents:
diff changeset
   550
		stdin.close();
hgs
parents:
diff changeset
   551
		registerFiles(files);
hgs
parents:
diff changeset
   552
	}
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
	/**
hgs
parents:
diff changeset
   555
	 * Registers files to document monitor.
hgs
parents:
diff changeset
   556
	 * 
hgs
parents:
diff changeset
   557
	 * @param sources
hgs
parents:
diff changeset
   558
	 *            sources
hgs
parents:
diff changeset
   559
	 * @throws TraceCompilerRootException 
hgs
parents:
diff changeset
   560
	 */
hgs
parents:
diff changeset
   561
	private void registerFiles(ArrayList<String> sources) throws TraceCompilerIllegalArgumentsException {
hgs
parents:
diff changeset
   562
hgs
parents:
diff changeset
   563
		if (sources.size() == 0) {
hgs
parents:
diff changeset
   564
			throw new TraceCompilerIllegalArgumentsException(Messages.getString("TraceCompiler.noSourceFilesExceptionText"), null); //$NON-NLS-1$
hgs
parents:
diff changeset
   565
		}
hgs
parents:
diff changeset
   566
		File parent = mmpPath.getParentFile();
hgs
parents:
diff changeset
   567
		boolean found = false;
hgs
parents:
diff changeset
   568
hgs
parents:
diff changeset
   569
		componentPath = parent.getAbsolutePath();
hgs
parents:
diff changeset
   570
hgs
parents:
diff changeset
   571
		ProjectEngine.traceFolderName = TraceCompilerConstants.TRACES_DIRECTORY;
hgs
parents:
diff changeset
   572
hgs
parents:
diff changeset
   573
		// Find location of "traces" or "traces_<component name>" -folder. If
hgs
parents:
diff changeset
   574
		// "traces" or "traces_<component name>" -folder does not
hgs
parents:
diff changeset
   575
		// exist, "traces" -folder will be add to same level than "group" or
hgs
parents:
diff changeset
   576
		// "mmpfiles" -folder. If "group" or "mmpfiles" -folder does not exist
hgs
parents:
diff changeset
   577
		// then "traces" -folder will be added to same level than source file.
hgs
parents:
diff changeset
   578
		while (!found && parent != null) {
hgs
parents:
diff changeset
   579
			File[] children = parent.listFiles();
hgs
parents:
diff changeset
   580
			if (children != null) {
hgs
parents:
diff changeset
   581
				for (int i = 0; i < children.length; i++) {
hgs
parents:
diff changeset
   582
					File child = children[i];
hgs
parents:
diff changeset
   583
					String childName = child.getName();
hgs
parents:
diff changeset
   584
					if (child.isDirectory() && isProjectRoot(childName)) {
hgs
parents:
diff changeset
   585
						componentPath = parent.getAbsolutePath();
hgs
parents:
diff changeset
   586
						found = true;
hgs
parents:
diff changeset
   587
hgs
parents:
diff changeset
   588
						// Check that does subdirectory that name is
hgs
parents:
diff changeset
   589
						// "traces_<component name>" exist in this directory. If
hgs
parents:
diff changeset
   590
						// it exist use that as traces directory name.
hgs
parents:
diff changeset
   591
						for (i = 0; i < children.length; i++) {
hgs
parents:
diff changeset
   592
							child = children[i];
hgs
parents:
diff changeset
   593
							childName = child.getName();
hgs
parents:
diff changeset
   594
							if (child.isDirectory()
hgs
parents:
diff changeset
   595
									&& childName
hgs
parents:
diff changeset
   596
											.equalsIgnoreCase(traceFolderName)) {
hgs
parents:
diff changeset
   597
								ProjectEngine.traceFolderName = traceFolderName;
hgs
parents:
diff changeset
   598
								break;
hgs
parents:
diff changeset
   599
							}
hgs
parents:
diff changeset
   600
						}
hgs
parents:
diff changeset
   601
						break;
hgs
parents:
diff changeset
   602
					}
hgs
parents:
diff changeset
   603
				}
hgs
parents:
diff changeset
   604
			}
hgs
parents:
diff changeset
   605
hgs
parents:
diff changeset
   606
			if (found == false) {
hgs
parents:
diff changeset
   607
				parent = parent.getParentFile();
hgs
parents:
diff changeset
   608
			}
hgs
parents:
diff changeset
   609
		}
hgs
parents:
diff changeset
   610
hgs
parents:
diff changeset
   611
		registerSourceFiles(sources);
hgs
parents:
diff changeset
   612
	}
hgs
parents:
diff changeset
   613
hgs
parents:
diff changeset
   614
	/**
hgs
parents:
diff changeset
   615
	 * Checks if this folder is the project root
hgs
parents:
diff changeset
   616
	 * 
hgs
parents:
diff changeset
   617
	 * @param name
hgs
parents:
diff changeset
   618
	 *            name of the folder
hgs
parents:
diff changeset
   619
	 * @return true if this folder is the project root
hgs
parents:
diff changeset
   620
	 */
hgs
parents:
diff changeset
   621
	private boolean isProjectRoot(String name) {
hgs
parents:
diff changeset
   622
		boolean retval = false;
hgs
parents:
diff changeset
   623
		if (name.equalsIgnoreCase(traceFolderName)
hgs
parents:
diff changeset
   624
				|| name.equalsIgnoreCase(SymbianConstants.GROUP_DIRECTORY)
hgs
parents:
diff changeset
   625
				|| name.equalsIgnoreCase(SymbianConstants.MMPFILES_DIRECTORY)
hgs
parents:
diff changeset
   626
				|| name
hgs
parents:
diff changeset
   627
						.equalsIgnoreCase(TraceCompilerConstants.TRACES_DIRECTORY)) {
hgs
parents:
diff changeset
   628
			retval = true;
hgs
parents:
diff changeset
   629
		}
hgs
parents:
diff changeset
   630
		return retval;
hgs
parents:
diff changeset
   631
	}
hgs
parents:
diff changeset
   632
hgs
parents:
diff changeset
   633
	/**
hgs
parents:
diff changeset
   634
	 * Registers source files
hgs
parents:
diff changeset
   635
	 * 
hgs
parents:
diff changeset
   636
	 * @param files
hgs
parents:
diff changeset
   637
	 */
hgs
parents:
diff changeset
   638
	private void registerSourceFiles(ArrayList<String> files) {
hgs
parents:
diff changeset
   639
		if (files.size() > 0) {
hgs
parents:
diff changeset
   640
			String[] fileArr = new String[files.size()];
hgs
parents:
diff changeset
   641
			files.toArray(fileArr);
hgs
parents:
diff changeset
   642
hgs
parents:
diff changeset
   643
			// Sets the source files to the TraceCompiler document
hgs
parents:
diff changeset
   644
			// factory. It will create a document from each source in the array
hgs
parents:
diff changeset
   645
			FileDocumentMonitor.setFiles(fileArr);
hgs
parents:
diff changeset
   646
			DocumentFactory.registerDocumentFramework(
hgs
parents:
diff changeset
   647
					new FileDocumentMonitor(), StringDocumentFactory.class);
hgs
parents:
diff changeset
   648
		}
hgs
parents:
diff changeset
   649
	}
hgs
parents:
diff changeset
   650
hgs
parents:
diff changeset
   651
	/**
hgs
parents:
diff changeset
   652
	 * Initializes TraceCompiler
hgs
parents:
diff changeset
   653
	 * @throws TraceCompilerRootException if fail to initialize the plugins
hgs
parents:
diff changeset
   654
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   655
	 */
hgs
parents:
diff changeset
   656
	private void start() throws TraceCompilerRootException, TraceCompilerException {
hgs
parents:
diff changeset
   657
hgs
parents:
diff changeset
   658
		// Starts TraceCompiler. This is normally called from the Eclipse
hgs
parents:
diff changeset
   659
		// plug-in
hgs
parents:
diff changeset
   660
		// activator, but in console case that does not exist
hgs
parents:
diff changeset
   661
		TraceCompilerEngineGlobals.start();
hgs
parents:
diff changeset
   662
				
hgs
parents:
diff changeset
   663
		
hgs
parents:
diff changeset
   664
		//Reads the GroupId values from opensystemtrace_types.h
hgs
parents:
diff changeset
   665
		//If this fails a message is logged and trace compiler stops
hgs
parents:
diff changeset
   666
		GroupNames.initialiseGroupName();
hgs
parents:
diff changeset
   667
hgs
parents:
diff changeset
   668
		
hgs
parents:
diff changeset
   669
		// Registers a view to TraceCompiler
hgs
parents:
diff changeset
   670
		TraceCompilerEngineGlobals
hgs
parents:
diff changeset
   671
				.setView(new TraceCompilerView(componentPath));
hgs
parents:
diff changeset
   672
hgs
parents:
diff changeset
   673
		// Registers all plug-in components
hgs
parents:
diff changeset
   674
		for (TraceCompilerPlugin plugin : plugIns) {
hgs
parents:
diff changeset
   675
			TraceCompilerEngineGlobals.registerPlugin(plugin);
hgs
parents:
diff changeset
   676
		}
hgs
parents:
diff changeset
   677
		// Adds a model event listener
hgs
parents:
diff changeset
   678
		TraceCompilerEngineGlobals.getTraceModel().addModelListener(
hgs
parents:
diff changeset
   679
				modelListener);
hgs
parents:
diff changeset
   680
		TraceCompilerEngineGlobals.getTraceModel().addExtensionListener(
hgs
parents:
diff changeset
   681
				modelListener);
hgs
parents:
diff changeset
   682
		TraceCompilerEngineGlobals.getTraceModel().getExtension(
hgs
parents:
diff changeset
   683
				TraceLocationList.class).addLocationListListener(modelListener);
hgs
parents:
diff changeset
   684
		TraceCompilerEngineGlobals.getTraceModel().addProcessingListener(modelListener);
hgs
parents:
diff changeset
   685
	}
hgs
parents:
diff changeset
   686
hgs
parents:
diff changeset
   687
	/**
hgs
parents:
diff changeset
   688
	 * Parses the sources and generates trace files
hgs
parents:
diff changeset
   689
	 * @throws Exception 
hgs
parents:
diff changeset
   690
	 */
hgs
parents:
diff changeset
   691
	private void buildTraceFiles() throws Exception {
hgs
parents:
diff changeset
   692
		TraceCompilerEngineInterface tbi = TraceCompilerEngineGlobals
hgs
parents:
diff changeset
   693
				.getTraceCompiler();
hgs
parents:
diff changeset
   694
		try {
hgs
parents:
diff changeset
   695
			// Opens a trace project
hgs
parents:
diff changeset
   696
			componentName = TraceUtils.convertName(componentName);
hgs
parents:
diff changeset
   697
hgs
parents:
diff changeset
   698
			// Set project path before opening project
hgs
parents:
diff changeset
   699
			TraceCompilerEngineGlobals.setProjectPath(componentPath);
hgs
parents:
diff changeset
   700
			tbi.openProject(componentName);
hgs
parents:
diff changeset
   701
			TraceModel model = TraceCompilerEngineGlobals.getTraceModel();
hgs
parents:
diff changeset
   702
			if (model.isValid()) {
hgs
parents:
diff changeset
   703
				model.setID((int) componentUID);
hgs
parents:
diff changeset
   704
hgs
parents:
diff changeset
   705
				// Location errors are printed after a file changes, but the
hgs
parents:
diff changeset
   706
				// last file is not detected by the listener
hgs
parents:
diff changeset
   707
				if (modelListener.getErrors().size() > 0) {
hgs
parents:
diff changeset
   708
					modelListener.printLocationErrors();
hgs
parents:
diff changeset
   709
					tbi.closeProject();
hgs
parents:
diff changeset
   710
					throw new TraceCompilerRootException(null, null);
hgs
parents:
diff changeset
   711
				}
hgs
parents:
diff changeset
   712
				tbi.exportProject();
hgs
parents:
diff changeset
   713
				tbi.closeProject();
hgs
parents:
diff changeset
   714
			} else {
hgs
parents:
diff changeset
   715
				String msg = "Project creation was cancelled"; //$NON-NLS-1$
hgs
parents:
diff changeset
   716
				throw new TraceCompilerRootException(msg, null);
hgs
parents:
diff changeset
   717
			}
hgs
parents:
diff changeset
   718
		} catch (TraceCompilerException e) {
hgs
parents:
diff changeset
   719
			TraceCompilerEngineGlobals.getEvents().postError(e);
hgs
parents:
diff changeset
   720
			throw new TraceCompilerRootException("Build trace files failed.", e); //$NON-NLS-1$
hgs
parents:
diff changeset
   721
		}
hgs
parents:
diff changeset
   722
	}
hgs
parents:
diff changeset
   723
hgs
parents:
diff changeset
   724
	/**
hgs
parents:
diff changeset
   725
	 * Shuts down TraceCompiler
hgs
parents:
diff changeset
   726
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   727
	 */
hgs
parents:
diff changeset
   728
	private void shutdown() throws TraceCompilerException {
hgs
parents:
diff changeset
   729
		for (TraceCompilerPlugin plugin : plugIns) {
hgs
parents:
diff changeset
   730
			TraceCompilerEngineGlobals.unregisterPlugin(plugin);
hgs
parents:
diff changeset
   731
		}
hgs
parents:
diff changeset
   732
		TraceCompilerEngineGlobals.shutdown();
hgs
parents:
diff changeset
   733
	}
hgs
parents:
diff changeset
   734
hgs
parents:
diff changeset
   735
	/**
hgs
parents:
diff changeset
   736
	 * Checks if the MMP file is valid
hgs
parents:
diff changeset
   737
	 * 
hgs
parents:
diff changeset
   738
	 * @return true if MMP file is valid
hgs
parents:
diff changeset
   739
	 */
hgs
parents:
diff changeset
   740
	private boolean isMmpValid() {
hgs
parents:
diff changeset
   741
		boolean valid = false;
hgs
parents:
diff changeset
   742
		String pathStr = mmpPath.getAbsolutePath();
hgs
parents:
diff changeset
   743
hgs
parents:
diff changeset
   744
		if (mmpPath.exists() && pathStr.length() > MMP.length()) {
hgs
parents:
diff changeset
   745
			String end = pathStr.substring(pathStr.length() - MMP.length());
hgs
parents:
diff changeset
   746
			if (end.equalsIgnoreCase(MMP)) {
hgs
parents:
diff changeset
   747
				valid = true;
hgs
parents:
diff changeset
   748
			} else {
hgs
parents:
diff changeset
   749
				TraceCompilerLogger.printError("Invalid MMP file: " + mmpPath.getAbsolutePath()); //$NON-NLS-1$
hgs
parents:
diff changeset
   750
			}
hgs
parents:
diff changeset
   751
		} else {
hgs
parents:
diff changeset
   752
			TraceCompilerLogger.printError("Missing or can not access MMP path: " + mmpPath.getAbsolutePath()); //$NON-NLS-1$
hgs
parents:
diff changeset
   753
		}
hgs
parents:
diff changeset
   754
		return valid;
hgs
parents:
diff changeset
   755
		
hgs
parents:
diff changeset
   756
	}
hgs
parents:
diff changeset
   757
hgs
parents:
diff changeset
   758
}